gpt4 book ai didi

JavaFX listView int[] 类型的拖动列表项(Java Messsge :-1 )

转载 作者:行者123 更新时间:2023-12-01 06:08:27 26 4
gpt4 key购买 nike

所以我有一个相当艰巨的任务,让我的 ListView 项目可拖动,以便我可以更改它们的索引, ListView 中的项目是 int[] 所以我使用 CustomWeaponRecoilRowListCell<T> extends ListCell<T>使用 参数,因为我不想将 int[] 封装在某个对象中,并且我无法将任何 int 数组类放在那里/没有。

我关注 Jewelsea How to create a reorder-able TableView in JavaFx 的惊人答案

我的第一次尝试是:

public class CustomWeaponRecoilRowListCell<T> extends ListCell<T> {

private final StringBuilder sb = new StringBuilder();

public CustomWeaponRecoilRowListCell() {

setOnDragDetected((MouseEvent event) -> {
if (getItem() == null) {
return;
}
ObservableList<T> items = (ObservableList<T>) getListView().getItems();

Dragboard dragboard = startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();

content.putString(CsgoRr.objectToJsonString(getItem()));

dragboard.setDragView(textToImage(CsgoRr.objectToJsonString(getItem())));

dragboard.setContent(content);
event.consume();
});

setOnDragOver(event -> {
if (event.getGestureSource() != this
&& event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});

setOnDragEntered(event -> {
if (event.getGestureSource() != this
&& event.getDragboard().hasString()) {
setOpacity(0.3);
}
});

setOnDragExited(event -> {
if (event.getGestureSource() != this
&& event.getDragboard().hasString()) {
setOpacity(1);
}
});

setOnDragDropped(event -> {
if (getItem() == null) {
return;
}

Dragboard db = event.getDragboard();
boolean success = false;

if (db.hasString()) {
ObservableList<T> items = getListView().getItems();

int draggedIdx = items.indexOf(db.getString());
int thisIdx = items.indexOf(getItem());

items.set(draggedIdx, getItem());
items.set(thisIdx, jsonRowStringToT(db.getString()));

List<T> itemscopy = new ArrayList<>(getListView().getItems());
getListView().getItems().setAll(itemscopy);

success = true;
}
event.setDropCompleted(success);

event.consume();
});

setOnDragDone(DragEvent::consume);
}

private T jsonRowStringToT(String jsonRow) {//take care of possible exceptions

String[] row = jsonRow.replace("]", "").replace("[", "").split(",");
int[] parsedRow = new int[RecoilPattern.PATTERN_WIDTH];
for (int i = 0; i < RecoilPattern.PATTERN_WIDTH; i++) {
parsedRow[i] = Integer.valueOf(row[i]);
}
return (T) parsedRow;
}

@Override
public void updateItem(T item, boolean empty) {
int[] recoil = (int[]) item;
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
sb.append("[Number of steps:").append(recoil[0]).append(", Pixels per step:").
append(recoil[1]).append(", Direction:").append(RecoilPattern.directionToString(recoil[2])).append("]");

setText(sb.toString());
sb.delete(0, sb.length());
sb.trimToSize();
}
}

private static Image textToImage(String text) {
Label label = new Label(text);

label.setMinSize(80, 20);
label.setMaxSize(80, 20);
label.setPrefSize(80, 20);
label.setStyle("-fx-background-color: white; -fx-text-fill:black;");
label.setWrapText(true);
Scene scene = new Scene(new Group(label));
WritableImage img = new WritableImage(80, 20);
scene.snapshot(img);
return img;
}

}

这表明我在拖动时甚至从我想要拖动的数据文本创建图像,这可以工作,我进入 STACKTRACE 的所有内容是:

Java Messsge:-1

当我尝试调试这个时,这对我来说非常无用,这个错误是当我将列表项拖放到 ListView 中的另一个位置时产生的,没有数据发生变化。

为什么我要把这个放入我的控制台?没有我可以使用的合理堆栈跟踪?

问题的动图:

enter image description here

最佳答案

好的,我首先找到了问题所在 draggedIdx总是 -1 由于某种原因,我无法从 Jewelsea 的答案中获得正确的索引值,即使使用缓存值也尝试了多种方法,索引跟踪/值在拖拽检测时为空,所以我决定使用 getListView().getSelectionModel().getSelectedIndex(); 获取拖动索引

这似乎工作正常。

关于JavaFX listView int[] 类型的拖动列表项(Java Messsge :-1 ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com