所以我有一项艰巨的任务,我可以将listview项目拖放,这样我就可以更改它们的索引,listview中的项目是 int [] 所以我使用CustomWeaponRecoilRowListCell<T> extends ListCell<T>
< / strong> param,因为我不想在某个对象中封装我的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中的另一个位置时,没有数据发生更改。
为什么我会把它放到我的控制台?没有合理的堆栈跟踪我可以使用吗?
问题的Gif:
答案 0 :(得分:0)
好的我发现问题是什么,首先draggedIdx
总是 -1 由于某些原因我无法从jewelsea的答案中获得正确的索引值即使使用缓存值,索引跟踪/值在dragDetected点处为null,所以我决定使用getListView().getSelectionModel().getSelectedIndex();
这似乎工作正常。
答案 1 :(得分:-1)
在CustomWeaponRecoilRowListCell()中,您需要在所有代码上放置一个try和catch块以获取适当的堆栈跟踪消息。
如果打印堆栈跟踪并解决问题不起作用请尝试这个要点,它对我很有用:https://gist.github.com/jewelsea/7821196
祝您好运,如果您需要更多帮助,请告诉我们!