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();

来拖动索引

这似乎工作正常。