javafx listview和treeview控件未正确重新绘制 [英] javafx listview and treeview controls are not repainted correctly
问题描述
我正在尝试使用javafx将元素放在listview和treeview上,但两个控件都不会刷新它们的内容。我使用一个obvservable列表来控制项目,每次我删除一个项目时,listview或treeview将其从数据源中删除。但视图没有更新。我还在看所有物品。唯一的区别是,删除的项目不能再被选中。例如,链接2显示了拼贴项目列表。图1显示了拼贴前的项目。项目已折叠,但旧条目仍然可见。有没有人知道这个问题的解决方案。谢谢大家帮助我
i am trying to put elements on a listview and treeview with javafx, but both controls wont refresh theyre content. i am using an obvservable list to control the items and every time i delete one item, the listview or treeview removes it from the datasource. but the view is not updating. i am still seeing all the items. the only difference is, the removed item can not be selected any more. for example link 2 shows the collaped item list. image 1 shows the items before they are collaped. the items are collapsed but the old entry is still visible. does anybody know a solution for this problem. thank you all for helping me
链接1: treeview未折叠
链接2:树视图已折叠但未更新旧视图
这是我用来显示列表视图的自定义单元工厂:
this is the custom cell factory i use to display a 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;
}
推荐答案
你的手机工厂的 updateItem(...)
需要处理单元格为空的情况。这将是一个项目被删除(或因为 TreeView
中的节点被折叠而变空)并且之前显示项目的单元格被重用为空的情况cell:
Your cell factory's updateItem(...)
needs to handle the case where the cell is empty. This will be exactly the scenario when an item is removed (or becomes empty because a node in the TreeView
was collapsed) and the cell that previously showed an item is reused as an empty cell:
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 ;
}
这篇关于javafx listview和treeview控件未正确重新绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!