如何将域对象绑定到JavaFX TreeView



如何将域对象绑定到JavaFX TreeView?ComboBox有getItems(),您可以向该集合添加一些内容。TreeView似乎没有这样的方法。我只能手动构建树,方法是将TreeItems添加到TreeView的根目录中,然后使用getChildren().add(...)添加子目录,但似乎没有办法只添加一个可观察的树结构。

域对象可以从文件中读取自己,也可以将自己写入文件。它有修改其内容的方法。如何最好地将其与TreeView连接起来,以便用户可以添加和删除节点?

我不想在我的域对象中使用GUI代码(即JavaFX类)。

我需要写一个Adapter类来把我的域对象变成JavaFX树吗?然后将侦听器添加到树中,并将更改映射回域对象?或者有更好的方法吗?

前段时间我遇到了类似的问题。我已经编写了一个自定义的TreeItem实现,它可以处理递归数据结构。我写了一篇博客文章,在这里有详细的解释和代码。

例如,考虑一个类Task,它可以包含许多子任务等等

public class Task {
private ObservableList<Task> subtasks = FXCollections.observableArrayList();
public ObservableList<Task> getSubtasks() {
return subtasks;
}
}

在这种情况下,您可以按如下方式使用它:

Task root = new Task();
TreeItem<Task> rootItem = new RecursiveTreeItem<Task>(root, Task::getSubtasks); 
tree.setRoot(rootItem);

第二个参数的类型为Callback<T, ObservableList<T>>:该函数接受T的元素(在我们的例子中为Task),并返回该元素的子元素。在这个例子中,我使用了方法引用作为快捷方式。

这是一个完全被动的实现,即当添加新的子项时,它将立即显示在TreeView中。

你说过你不喜欢在你的域模型中有JavaFX类。在这种情况下,你可以写这样的东西(未测试):

TreeItem<Task> rootItem = new RecursiveTreeItem<Task>(root, 
task -> FXCollections.observableArrayList(task.getSubtasks()));

这里getSubtasks()返回一个封装在observableList中的普通List<Task>。当然,在这种情况下,当您的模型发生变化时,TreeView不会自动更新。

最新更新