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

时间:2016-10-01 13:11:18

标签: java listview javafx listitem

所以我有一项艰巨的任务,我可以将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:

enter image description here

2 个答案:

答案 0 :(得分:0)

好的我发现问题是什么,首先draggedIdx总是 -1 由于某些原因我无法从jewelsea的答案中获得正确的索引值即使使用缓存值,索引跟踪/值在dragDetected点处为null,所以我决定使用getListView().getSelectionModel().getSelectedIndex();

来拖动索引

这似乎工作正常。

答案 1 :(得分:-1)

在CustomWeaponRecoilRowListCell()中,您需要在所有代码上放置一个try和catch块以获取适当的堆栈跟踪消息。

如果打印堆栈跟踪并解决问题不起作用请尝试这个要点,它对我很有用:https://gist.github.com/jewelsea/7821196

祝您好运,如果您需要更多帮助,请告诉我们!