如何将域对象绑定到JavaFX TreeView? ComboBox有getItems()
,您可以在该集合中添加内容。 TreeView似乎没有这样的方法。我只能通过将TreeItems添加到TreeView的根目录然后使用getChildren().add(...)
添加子项来手动构建树,但似乎没有办法只添加可观察的树结构。
域对象可以从文件中读取自身并将自身写入文件。它有修改其内容的方法。如何最好地将其与TreeView挂钩,以便用户可以添加和删除节点?
我不想在我的域对象中使用GUI代码(即JavaFX类)。
我是否需要编写一个可以将我的域对象转换为JavaFX树的Adapter类?然后将监听器添加到树中并将更改映射回域对象?或者有更好的方法吗?
答案 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不会在模型更改时自动更新。