如何在JavaFX中刷新TreeItem的节点?

时间:2017-11-24 17:18:13

标签: java javafx

我有一个TreeView,它显示每个服务器下的服务器列表和数据库列表,所以它看起来像这样:

-localhost
---database1
---database2
---database3
-remotehost
---database4
---database5
---database6

在选择该服务器的treeitem(以节省加载时间)之前,不会填充每个服务器中的数据库。现在,当选择其他服务器时,我想刷新新选择的服务器上的数据库列表。目前,我的脚本只将dbs列表添加到新选择的服务器,但不删除已存在的dbs,即使我有脚本将其删除到位。我做错了什么?

connTree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() {
    @SuppressWarnings("unchecked")
    @Override
    public void changed(
            ObservableValue<? extends TreeItem<String>> observable,
            TreeItem<String> old_val, TreeItem<String> new_val) {
            TreeItem<String> selectedItem = new_val;
            String selectedHost =  selectedItem.getValue();
            if(selectedHost != "test"){
                if(conns.exists(selectedHost)){
                    selectedServer = conns.get(selectedHost);
                    selectedServer.getDatabases();
                    List<String> dbs = selectedServer.databases;
                    TreeItem<String> c = connTree.getSelectionModel().getSelectedItem();
                    c.getChildren().removeAll(c); //This should do what I want, right?
                    for(String db: dbs){
                        Button dbIcon = new Button("", new Glyph("FontAwesome", "DATABASE"));
                        dbIcon.setBackground(Background.EMPTY);
                        TreeItem<String> branch = new TreeItem<String>(db, dbIcon);
                        branch.setExpanded(true);
                        selectedItem.getChildren().add(branch);
                    }
                }
            }
    }

});

我没有收到任何错误。永远不会删除节点。提前谢谢。

1 个答案:

答案 0 :(得分:0)

奇怪的是,selectedItem.getChildren().clear()做了伎俩。我不确定clear()和removeAll()之间的区别是什么,但clear()有效。