Is drag and drop supported by TreeItem?

2019-04-07 09:36发布

I'm currently working with a JavaFx-2's TreeView representing a file system.

I want to enable drag and drop to allow move operations, but it looks like TreeItem doesn't include drag events listeners. I was only able to implement drag and drop on the englobing TreeView object, but it doesn't work for sub-items.

Am I missing something, or are drag and drop events not supported for TreeItems yet?

2条回答
爷的心禁止访问
2楼-- · 2019-04-07 10:15

Question answered by Csh on the Oracle Forums : https://forums.oracle.com/forums/message.jspa?messageID=10426066#10426066

You have to implement drag on drop on the TreeCell.

Write a CellFactory like this:

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

            treeCell.setOnDragDetected(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent mouseEvent) {

                }
            });

            return treeCell;
        }
    });

If he wants to claim his reputation or add information to his solution, I'll change this answer.

查看更多
The star\"
3楼-- · 2019-04-07 10:22

The answer by @Timst is correct, but you should change the "updateItem" method cause in the above case you wont be able to set the Graphic of the "TreeItem" and the tree collapse won't work properly (won't clear the text in subNodes).

just change the method to:

@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);
    }
}
查看更多
登录 后发表回答