javafx listview和treeview控件未正确重新绘制

javafx listview和treeview控件未正确重新绘制,java,javafx,treeview,repaint,Java,Javafx,Treeview,Repaint,我试图用javafx将元素放在listview和treeview上,但这两个控件都不会刷新它们的内容。我使用obvservable列表来控制项目,每次我删除一个项目时,listview或treeview都会将其从数据源中删除。但这一观点并没有更新。我还在看所有的东西。唯一的区别是,无法再选择已删除的项目。例如,链接2显示折叠的项目列表。图1显示了折叠前的项目。项目已折叠,但旧条目仍然可见。有人知道这个问题的解决办法吗。谢谢大家帮助我 链接1: 链接2: 这是我用来显示listview的自定义单元

我试图用javafx将元素放在listview和treeview上,但这两个控件都不会刷新它们的内容。我使用obvservable列表来控制项目,每次我删除一个项目时,listview或treeview都会将其从数据源中删除。但这一观点并没有更新。我还在看所有的东西。唯一的区别是,无法再选择已删除的项目。例如,链接2显示折叠的项目列表。图1显示了折叠前的项目。项目已折叠,但旧条目仍然可见。有人知道这个问题的解决办法吗。谢谢大家帮助我

链接1: 链接2:

这是我用来显示listview的自定义单元格工厂:

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;
    }
公共ListCell调用(最终ListView参数){
ListCell=新ListCell(){
@凌驾
受保护的void updateItem(最终T persistentObject,最终布尔值为空){
super.updateItem(persistentObject,空);
if(持久对象实例的POProcessStep){
POProcessStep POProcessStep=(POProcessStep)persistentObject;
if(persistentObject!=null){
super.setText(poProcessStep.getId()+“-”+poProcessStep.getTitle());
}
}else if(持久对象实例的POProcess){
POProcess POProcess=(POProcess)persistentObject;
if(persistentObject!=null){
super.setText(poProcess.getId()+“-”+poProcess.getTitle());
}
}else if(持久对象实例的POCategory){
POCategory POCategory=(POCategory)persistentObject;
if(persistentObject!=null){
super.setText(poCategory.getId()+“-”+poCategory.getTitle());
}
}else if(字符串的persistentObject实例){
if(persistentObject!=null){
super.setText(String.valueOf(persistentObject));
}
}
super.setGraphic(空);
}
};
返回单元;
}

您的单元格工厂的
更新项(…)
需要处理单元格为空的情况。当项目被删除(或由于
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 ;
}
公共ListCell调用(最终ListView参数){
ListCell=新ListCell(){
@凌驾
受保护的void updateItem(最终T persistentObject,最终布尔值为空){
super.updateItem(persistentObject,空);
if(空){
setText(空);
设置图形(空);
}否则{
//…代码的其余部分。
}
}
}
返回单元;
}

您使用的是定制电池工厂吗?如果是这样,请发布您的代码。谢谢您的回答。我确实有一个if(empty)子句,但这提醒我,要验证我的所有更改是否都在该子句中恢复(它们不是)。我已经这样做了,但它仍然不起作用!