Javafx 2 双击树节点时如何触发事件

Javafx 2 双击树节点时如何触发事件,javafx-2,javafx,javafx-8,Javafx 2,Javafx,Javafx 8,我有一段代码,它在远程Java类中创建了新的选项卡 treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() { @Override public void changed(ObservableValue<? extends TreeItem<Stri

我有一段代码,它在远程Java类中创建了新的选项卡

treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>()
        {
            @Override
            public void changed(ObservableValue<? extends TreeItem<String>> observable, TreeItem<String> oldValue, TreeItem<String> newValue)
            {
                System.out.println("Selected Text : " + newValue.getValue());
                // Create New Tab
                Tab tabdata = new Tab();
                Label tabALabel = new Label("Test");
                tabdata.setGraphic(tabALabel);

                DataStage.addNewTab(tabdata);
            }
        });
treeView.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener())
{
@凌驾

public void已更改(observeValue您可以向
TreeView.setOnMouseClicked()
方法添加
EventHandler
,并检查
getClickCount()
返回
MouseEvent
的值,以确定它是否是双击。删除上面的
ChangeListener
,并将逻辑添加到
EventHandler

它看起来是这样的。您可能还需要检查该项的
null

treeView.setOnMouseClicked(new EventHandler<MouseEvent>()
{
    @Override
    public void handle(MouseEvent mouseEvent)
    {            
        if(mouseEvent.getClickCount() == 2)
        {
            TreeItem<String> item = treeView.getSelectionModel().getSelectedItem();
            System.out.println("Selected Text : " + item.getValue());

            // Create New Tab
            Tab tabdata = new Tab();
            Label tabALabel = new Label("Test");
            tabdata.setGraphic(tabALabel);

            DataStage.addNewTab(tabdata);
        }
    }
});
treeView.setOnMouseClicked(新建EventHandler())
{
@凌驾
公共无效句柄(MouseEvent MouseEvent)
{            
if(mouseEvent.getClickCount()==2)
{
TreeItem=treeView.getSelectionModel().getSelectedItem();
System.out.println(“所选文本:+item.getValue());
//创建新选项卡
Tab tabdata=new Tab();
标签标签标签=新标签(“测试”);
tabdata.setGraphic(tabALabel);
DataStage.addNewTab(tabdata);
}
}
});

在我看来,最佳实践是实现您的计算单元

public class DoubleClickCellImpl extends TreeCell<String> {
    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (item == null || empty) {
            setText(null);
        } else {
            setText(item);
        }
    }

    public DoubleClickCellImpl() {
        super();

        setOnMouseClicked(event -> {
            TreeItem<String> ti = getTreeItem();
            if (ti == null || event.getClickCount() < 2)
                return;

            // do something here.
        });
    }
}
公共类DoubleClickCellImpl扩展TreeCell{
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
}否则{
setText(项目);
}
}
公共DoubleClickCellImpl(){
超级();
setOnMouseClicked(事件->{
TreeItem ti=getTreeItem();
if(ti==null | | event.getClickCount()<2)
返回;
//在这里做点什么。
});
}
}

你能给我看一些实现代码吗?我是JavaFX新手,这对我来说是一个高级的东西。如果他们用另一种方法(比如键盘)扩展一个节点怎么办?我想我们必须将多个事件绑定到同一个处理程序=/。似乎应该有一个处理程序来处理这类事情。(onNodeActivated或其他)@此答案特定于双击操作。如果要触发任何展开/折叠事件,则需要查看
TreeItem.expandedProperty()
。可以向其添加
ChangeListener
(可能通过
TreeCell
工厂)并在此处添加您的功能。请在此处签出答案: