【问题标题】:TreeView based on ObservableList gives undesirable result基于 ObservableList 的 TreeView 给出了不希望的结果
【发布时间】:2019-06-07 20:43:05
【问题描述】:

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

【问题讨论】:

    标签: javafx treeview observable listener


    【解决方案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);
            }
        }  
    }
    

    【讨论】:

      【解决方案2】:

      好的,我修复了它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        • 2017-01-05
        相关资源
        最近更新 更多