TreeItem上的图形在拖放时消失

时间:2014-10-01 13:37:16

标签: javafx treeview

我有这个基本代码,可以在树视图中添加拖放功能。

代码工作正常,但是当拖动,删除并添加到另一个树项目中的一个树项目时,原始树单元格中的树项目上的图形消失,而图形跟随拖动的元素并且在新的树项目中可见。

参见图片,例如树图案"名称"已被拖到"列名称"并失去了它的图形。在"列名称"下新的TreeItem还有它的图形。

enter image description here

添加拖放的代码是:

private void addDragAndDrop(TreeCell<String> treeCell, MainFXMLController mainFXMLController) {

    treeCell.setOnDragDetected(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            System.out.println("setOnDragDetected");

            Dragboard db = treeCell.startDragAndDrop(TransferMode.ANY);

            ClipboardContent content = new ClipboardContent();

            content.putString(event.toString());
            db.setContent(content);

            DRAGGEDSOURCE = treeCell;

            DRAGGEDINDEX = (treeCell.getTreeView().getSelectionModel().getSelectedIndex());

        }
    });

    treeCell.setOnDragOver(new EventHandler<DragEvent>() {
        //brukeren har dragget det over et element
        public void handle(DragEvent event) {

            DRAGGEDTARGET = treeCell.getTreeItem();

            if (event.getGestureSource() != treeCell
                    && event.getDragboard().hasString()) {

                event.acceptTransferModes(TransferMode.COPY_OR_MOVE);

            }

        }

    });

    treeCell.setOnDragDropped(new EventHandler<DragEvent>() {
        public void handle(DragEvent event) {

            DRAGGEDTARGET.getChildren().add(DRAGGEDSOURCE.getTreeItem());


        }
    );

}

public void makeTreeViewDragAble(TreeView treeView, MainFXMLController mainFXMLController) {

    treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
        @Override
        public TreeCell<String> call(TreeView<String> stringTreeView) {
            TreeCell<String> treeCell = new TreeCell<String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (!empty && item != null) {
                        setText(item);
                        setGraphic(getTreeItem().getGraphic());

                    } else {
                        setText(null);
                        setGraphic(null);

                    }
                }
            };

            addDragAndDrop(treeCell, mainFXMLController);
            treeView.setEditable(true);
            return treeCell;
        }
    });
}

1 个答案:

答案 0 :(得分:0)

正如@James_D和我总结的那样,这是因为我试图拥有两个imageView实例。解决方案是在旧项目上设置新的图像视图。