gpt4 book ai didi

java - 如何在 JavaFX 8 中为复杂的 TreeView 定义简单模型?

转载 作者:行者123 更新时间:2023-11-30 08:50:30 27 4
gpt4 key购买 nike

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 的示例中一样.

我想知道如何为满足以下要求的上述结构定义设计良好的模型。

  • 根据叶子的类类型显示不同的上下文菜单
  • 可以在树的任何级别插入和删除叶子
  • 轻松访问叶对象,以便我可以对它们调用 getter/setter
  • 树在模型改变时自动更新

任何解决方案或现有解决方案的好文章?

最佳答案

所以在@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()TopicGroup到我想出现在树叶上的文本。

关于java - 如何在 JavaFX 8 中为复杂的 TreeView<T> 定义简单模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com