关于javafx 2:双击树节点时如何触发事件

How to trigger event when double click on a tree node

我有这个代码在远程Java类中创建新的选项卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
            }
        });

当我双击树节点时,您能告诉我如何修改代码以打开新的选项卡吗?在我的代码中,当我单击一次时会打开选项卡。我需要什么事件处理程序?


您可以将EventHandler添加到TreeView.setOnMouseClicked()方法中,并检查MouseEventgetClickCount()返回值,以确定是否双击。删除上面的ChangeListener并将逻辑添加到EventHandler中。

使用这里的描述并将其应用于您的treeView变量。

看起来像这样。您可能还需要检查null的项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
        }
    }
});


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.
        });
    }
}