如何将域对象绑定到JavaFX TreeView?

时间:2014-01-12 23:05:46

标签: model-view-controller javafx

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

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

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

我是否需要编写一个可以将我的域对象转换为JavaFX树的Adapter类?然后将监听器添加到树中并将更改映射回域对象?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:6)

前段时间我遇到过类似的问题。我编写了一个可以处理递归数据结构的自定义public class Task { private ObservableList<Task> subtasks = FXCollections.observableArrayList(); public ObservableList<Task> getSubtasks() { return subtasks; } } 实现。我写了一篇博客文章,详细解释http://www.raywenderlich.com/3932

RecursiveTreeItem的代码可以找到here

作为一个例子,想一下可以包含许多子任务的类Task root = new Task(); TreeItem<Task> rootItem = new RecursiveTreeItem<Task>(root, Task::getSubtasks); tree.setRoot(rootItem); 等等。

Callback<T, ObservableList<T>>

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

T

第二个参数是Task类型:一个带有TreeItem<Task> rootItem = new RecursiveTreeItem<Task>(root, task -> FXCollections.observableArrayList(task.getSubtasks())); 元素的函数(在我们的例子中是getSubtasks())并返回该元素的子元素。在示例中,我使用方法引用作为快捷方式。

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

你说你不喜欢你的域模型中有JavaFX类。在这种情况下,您可以编写类似这样的内容(未经测试):

List<Task>

这里type fakeCStruct a::Uint8; b::Uint32; end var=fakeCStruct(3,4); 返回一个包含在observableList中的普通{{1}}。但在这种情况下,TreeView不会在模型更改时自动更新。

相关问题