javafx listview和treeview控件沒有被正確重繪



repaint (1)

我試圖把元素放在一個ListView和TreeView與javafx,但兩個控件都不會刷新它們的內容。 我正在使用obvservable列表來控制項目,每次我刪除一個項目時,listview或treeview從數據源中刪除它。 但是視圖不更新。 我仍然看到所有的項目。 唯一的區別是,刪除的項目不能再被選中。 例如鍊接2顯示了拼合的項目列表。 圖片1顯示了它們拼合之前的項目。 項目被折疊,但舊的條目仍然可見。 有沒有人知道這個問題的解決方案。 謝謝大家幫助我

鏈接1: treeview不折疊鏈接2: treeview被折疊,但不更新舊的視圖

這是我用來顯示一個列表視圖的自定義單元格工廠:

public ListCell<T> call(final ListView<T> param) {
        ListCell<T> cell = new ListCell<T>(){
            @Override
            protected void updateItem(final T persistentObject, final boolean empty) {
                super.updateItem(persistentObject, empty);
                if(persistentObject instanceof POProcessStep){
                    POProcessStep poProcessStep = (POProcessStep) persistentObject;
                    if (persistentObject != null) {
                        super.setText(poProcessStep.getId() + " - " + poProcessStep.getTitle());
                    }
                }else if(persistentObject instanceof POProcess){
                    POProcess poProcess = (POProcess) persistentObject; 
                    if (persistentObject != null) {
                        super.setText(poProcess.getId() + " - " + poProcess.getTitle());
                    }
                }else if(persistentObject instanceof POCategory){
                    POCategory poCategory = (POCategory) persistentObject;
                    if(persistentObject != null){
                        super.setText(poCategory.getId() + " - " + poCategory.getTitle());
                    }
                }else if(persistentObject instanceof String){
                    if(persistentObject != null){
                        super.setText(String.valueOf(persistentObject));
                    }
                }
                super.setGraphic(null);
            }
        };
        return cell;
    }

您的單元工廠的updateItem(...)需要處理單元格為空的情況。 當項目項目被刪除(或者由於TreeView一個節點被折疊而變為空白)並且以前顯示一個項目的單元格被重用為空單元格時,

public ListCell<T> call(final ListView<T> param) {
    ListCell<T> cell = new ListCell<T>(){
        @Override
        protected void updateItem(final T persistentObject, final boolean empty) {
            super.updateItem(persistentObject, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                // ... rest of your code.
            }
       }
    }
    return cell ;
}