JavaFX2 TreeView 菜单创建
JavaFX2 TreeView menu create
我有一个带有菜单内容的 Treeview,它正在运行。我只是不确定如何实现更多的根菜单来添加?
因为此代码仅显示 "File" 菜单和所有子菜单,而不显示其他根。
-另外我想问一下我怎样才能让这些子菜单像链接一样工作并为它们创建鼠标监听器?把听众带到哪里合适?
代码如下:
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);
你的问题的第一部分在这里得到回答: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
构造。
我有一个带有菜单内容的 Treeview,它正在运行。我只是不确定如何实现更多的根菜单来添加? 因为此代码仅显示 "File" 菜单和所有子菜单,而不显示其他根。
-另外我想问一下我怎样才能让这些子菜单像链接一样工作并为它们创建鼠标监听器?把听众带到哪里合适?
代码如下:
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);
你的问题的第一部分在这里得到回答: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
构造。