作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TLDR: How to implement JavaFX 8 TreeItem in a TreeView withdifferent object types?
我有具有以下对象结构的 XML 配置。
[Configuration]
--- has 1-n --->
[Group]
--- has 1-n --->
[Topic]
我想在 TreeView 中显示这个结构如下所示。
Groups
|
+-- Group A
| |-- Topic A
| |-- Topic B
|
+-- Group B
|-- Topic C
|-- Topic D
看完TreeItem文档 我只是想不出一个解决方案,因为我结构中的对象不是同一类型,所以我不能只定义一个 TreeItem<T>
与 TreeItem<File>
就像在 TreeItem 的示例中一样.
我想知道如何为满足以下要求的上述结构定义设计良好的模型。
任何解决方案或现有解决方案的好文章?
最佳答案
所以在@kleopatra(非常感谢)指出我使用类型 <Object>
之后我是这样做的。
public class TreeController implements Initializable {
...
@FXML
private TreeView<Object> treeView;
@Override
public void initialize(URL location, ResourceBundle resources) {
TreeItem<Object> root = new TreeItem<>("Groups");
for (Object object : cfg.getGroupList()) {
root.getChildren().add(createNode(object));
}
treeView.setRoot(root);
treeView.setCellFactory(p -> new TreeCellFactory());
root.setExpanded(true);
}
private TreeItem<Object> createNode(Object o) {
return new TreeItem<Object>(o) {
private boolean isLeaf;
private boolean isFirstTimeChildren = true;
private boolean isFirstTimeLeaf = true;
@Override
public ObservableList<TreeItem<Object>> getChildren() {
if (isFirstTimeChildren) {
isFirstTimeChildren = false;
super.getChildren().setAll(buildChildren(this));
}
return super.getChildren();
}
@Override
public boolean isLeaf() {
if (isFirstTimeLeaf) {
isFirstTimeLeaf = false;
if (o instanceof Topic) {
isLeaf = true;
}
}
return isLeaf;
}
private ObservableList<TreeItem<Object>> buildChildren(TreeItem<Object> treeItem) {
if (treeItem.getValue() instanceof Group) {
ObservableList<TreeItem<Object>> children = FXCollections.observableArrayList();
for (Object object : ((Group) treeItem.getValue()).getTopicList()) {
children.add(createNode(object));
}
return children;
}
return FXCollections.emptyObservableList();
}
};
}
private final class TreeCellFactory extends TreeCell<Object> {
private ContextMenu topicMenu = new ContextMenu();
private ContextMenu groupMenu = new ContextMenu();
public TreeCellFactory() {
MenuItem topicMenuItem = new MenuItem("- Item 1 -");
topicMenu.getItems().add(topicMenuItem);
MenuItem groupMenuItem = new MenuItem("- Item 1 -");
groupMenu.getItems().add(groupMenuItem);
}
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
setText(item.toString());
}
if (item instanceof Topic) {
setContextMenu(topicMenu);
}
if (item instanceof Group) {
setContextMenu(groupMenu);
}
}
}
}
请注意我覆盖了toString()
在 Topic
和 Group
到我想出现在树叶上的文本。
关于java - 如何在 JavaFX 8 中为复杂的 TreeView<T> 定义简单模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964007/
我是一名优秀的程序员,十分优秀!