我有一个带有菜单内容的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);
答案 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
构造。