7

我目前正在使用代表文件系统的 JavaFx-2 的TreeView 。

我想启用拖放以允许移动操作,但看起来TreeItem不包括拖动事件侦听器。我只能在 englobing TreeView 对象上实现拖放,但它不适用于子项目。

我是否遗漏了什么,或者 TreeItems 还不支持拖放事件?

4

2 回答 2

7

Csh 在 Oracle 论坛上回答的问题:https ://forums.oracle.com/forums/message.jspa?messageID=10426066#10426066

您必须在 TreeCell 上实现拖放。

像这样写一个 CellFactory:

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

如果他想声称自己的声誉或在他的解决方案中添加信息,我将更改此答案。

于 2012-07-09T15:44:30.033 回答
3

@Timst 的答案是正确的,但是您应该更改“updateItem”方法,因为在上述情况下您将无法设置“TreeItem”的图形并且树崩溃将无法正常工作(不会清除子节点中的文本)。

只需将方法更改为:

@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);
    }
}
于 2014-03-19T20:01:45.570 回答