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

TreeView based on ObservableList gives undesirable result

ObservableList obList 有一个侦听器,添加后它会更新 TreeView。当新字符串 "music" 添加到 obList 时,将创建新项目并将其放入树视图中。该项目呈现为“{ [music] added at 0 }”而不是预期的 "music".

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似乎包含字符串和额外信息。这是怎么回事,我该怎么办?

如果你不使用原始类型,编译器会抱怨这个问题。

您在下一行中将值设置为 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);
        }
    }  
}

好的,我修复了它:

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