2012-06-28 46 views
6

我目前正在使用代表文件系统的JavaFx-2的TreeView由TreeItem支持拖放吗?

我想启用drag and drop来允许移动操作,但它看起来像TreeItem不包括拖动事件监听器。我只能实现拖放TreeView对象,但它不适用于子项目。

我是否错过了某些东西,或者是拖放TreeItems不支持的事件?

回答

5

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

如果他想要求他的名誉,或者他的解决方案中添加信息,我会改变这个答案。

+2

你有没有想过写了这是如何实现的?很想看到一些功能性代码。干杯! –

+0

拖放文本是一个非常糟糕的解决方案。我的节点是复杂的Java对象,呈现为文本。 – Aubin

2

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