如何将域对象绑定到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不会自动更新。