基于ObservableList的TreeView给出了不良结果

时间:2019-01-13 18:06:38

标签: javafx treeview observable listener

一个ObservableList obList具有一个侦听器,此外,它还更新TreeView。在将新字符串“ music”添加到obList时,将创建新项目并将其放入树视图中。该项目呈现为“ {在0处添加[音乐]””,而不是预期的“音乐”。

TreeItem<String> root = new TreeItem();
root.setExpanded(true);
TreeView<String> treeView = new TreeView(root);
treeView.getChildren().add(new TreeItem<String>("cat")); // normal behaviour
obList = FXCollections.observableArrayList();
obList.addListener(new ListChangeListener<String>() {
    @Override
    public void onChanged(ListChangeListener.Change<? extends String> c) {
        while (c.next()) {
            if (c.wasAdded()) {
                TreeItem<String> temp = new TreeItem(c);
                tree.getRoot().getChildren().add(temp);
            }  
        }
});

obList.add("music");

似乎变量c包含字符串和其他信息。发生了什么,我该怎么办?

2 个答案:

答案 0 :(得分:1)

如果您不使用原始类型,则编译器会抱怨该问题。

在下一行中,将值设置为ListChangeListener.Change对象,而不是String。使用右侧的原始类型可以删除可能导致编译时错误的类型检查。

TreeItem<String> temp = new TreeItem(c);

相反,要遍历已添加项目的列表,并为所有项目添加TreeItem

while (c.next()) {
    if (c.wasAdded()) {
        for (String element : c.getAddedSubList()) {
            TreeItem<String> temp = new TreeItem<>(element);
            tree.getRoot().getChildren().add(temp);
        }
    }  
}

答案 1 :(得分:0)

好,我用:

obList.getAddedSubList().forEach(l ->
    TreeItem<String> temp = new TreeItem(l);
    tree.getRoot().getChildren().add(temp);
});