Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is drag and drop supported by TreeItem?

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?

like image 424
Timst Avatar asked Jun 28 '12 10:06

Timst


2 Answers

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.

like image 58
Timst Avatar answered Sep 24 '22 16:09

Timst


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);
    }
}
like image 28
GuyK Avatar answered Sep 23 '22 16:09

GuyK