JavaFX2 TreeView菜单创建

时间:2015-03-01 11:19:02

标签: menu javafx treeview fxml

我有一个带有菜单内容的Treeview,它正在运行。我只是不确定如何实现更多的根菜单添加?  因为此代码仅显示"文件"菜单和所有子菜单,但不是其他根。

- 另外我想问一下,我怎么能让这些子菜单像链接一样运行并为它们创建mouselisteners?哪里是听众的合适场所?

代码如下:

    TreeItem<String> treeItemRoot1 = new TreeItem<> ("File");
    TreeItem<String> treeItemRoot2 = new TreeItem<> ("Edit");
    TreeItem<String> treeItemRoot3 = new TreeItem<> ("View");
    TreeItem<String> treeItemRoot4 = new TreeItem<> ("Tools");
    TreeItem<String> treeItemRoot5 = new TreeItem<> ("Help");

    TreeItem<String> nodeItemA = new TreeItem<>("Item A");
    TreeItem<String> nodeItemB = new TreeItem<>("Item B");
    TreeItem<String> nodeItemC = new TreeItem<>("Item C");
    treeItemRoot1.getChildren().addAll(nodeItemA, nodeItemB, nodeItemC);


    TreeView<String> treeView = new TreeView<>(treeItemRoot1);

    StackPane.getChildren().add(treeView);

1 个答案:

答案 0 :(得分:1)

您的问题的第一部分在此处得到解答:Set two root nodes for TreeView

对于第二部分,它取决于您想要的功能。如果您想响应树中所选项目的更改(这将包括用户使用鼠标或使用键盘选择),那么可以向树的所选项目添加一个监听器:

treeView.getSelectionModel().selectedItemProperty().addListener((obs, oldItem, newItem) -> {
    if (newItem == treeItemRoot1) {
        // "file" selected...
    } else if (newItem == treeItemRoot2) {
        // edit selected
    } // etc...
});

如果您真的想要一个鼠标监听器,则需要向该单元添加一个监听器。为此,请使用单元工厂:

treeView.setCellFactory(tv -> {
    TreeCell<String> cell = new TreeCell<>();
    cell.textProperty().bind(cell.itemProperty());
    cell.setOnMousePressed(event -> {
        TreeItem<String> item = cell.getTreeItem();
        if (item == treeItemRoot1) {
            // "file" clicked...
        } else if (item == treeItemRoot2) {
            // etc...
        }
    }
    return cell ;
});

您可以找到更清晰地组织代码的方法,并避免使用大if - else构造。