JavaFX listView on-drag list items of type int[] ( Java Messsge:-1 )
JavaFX listView on-drag list items of type int[] ( Java Messsge:-1 )
所以我有一项艰巨的任务是让我的列表视图项目可拖动,这样我就可以更改它们的索引,列表视图中的项目是 int[] 所以我使用 CustomWeaponRecoilRowListCell<T> extends ListCell<T>
使用 参数,因为我不想将我的 int[] 封装在某个对象中,我无法获得任何 int 数组 class 来放置 there/there 是 none .
我关注 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
当我尝试调试时,这对我来说超级没用,这个错误是因为我将列表项拖放到列表视图中的另一个位置时,没有数据发生变化。
为什么我要把它放到我的控制台中?没有我可以使用的合理堆栈跟踪?
问题动图:
在 CustomWeaponRecoilRowListCell() 中,您需要在所有代码上放置一个 try 和 catch 块以获取适当的堆栈跟踪消息。
如果打印堆栈跟踪并解决问题不起作用,请尝试这个要点,它对我来说很好:https://gist.github.com/jewelsea/7821196
祝你好运,如果您需要更多帮助,请告诉我!
好的,我发现问题出在哪里了,首先,draggedIdx
总是 -1,出于某种原因,我无法获得正确的索引值从 jewelsea 的回答中尝试了多种方法,即使使用缓存值,索引跟踪/值在 dragDetected 点为空,所以我决定使用 getListView().getSelectionModel().getSelectedIndex();
来拖动索引
这似乎工作正常。
所以我有一项艰巨的任务是让我的列表视图项目可拖动,这样我就可以更改它们的索引,列表视图中的项目是 int[] 所以我使用 CustomWeaponRecoilRowListCell<T> extends ListCell<T>
使用 参数,因为我不想将我的 int[] 封装在某个对象中,我无法获得任何 int 数组 class 来放置 there/there 是 none .
我关注 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
当我尝试调试时,这对我来说超级没用,这个错误是因为我将列表项拖放到列表视图中的另一个位置时,没有数据发生变化。
为什么我要把它放到我的控制台中?没有我可以使用的合理堆栈跟踪?
问题动图:
在 CustomWeaponRecoilRowListCell() 中,您需要在所有代码上放置一个 try 和 catch 块以获取适当的堆栈跟踪消息。
如果打印堆栈跟踪并解决问题不起作用,请尝试这个要点,它对我来说很好:https://gist.github.com/jewelsea/7821196
祝你好运,如果您需要更多帮助,请告诉我!
好的,我发现问题出在哪里了,首先,draggedIdx
总是 -1,出于某种原因,我无法获得正确的索引值从 jewelsea 的回答中尝试了多种方法,即使使用缓存值,索引跟踪/值在 dragDetected 点为空,所以我决定使用 getListView().getSelectionModel().getSelectedIndex();
这似乎工作正常。