JavaFXListView显示的项目太多

JavaFXListView显示的项目太多,listview,javafx,duplicates,refresh,Listview,Javafx,Duplicates,Refresh,我在JavaFX中有一个ListView,当我删除一个项目时,会在ListView中显示更多的项目,但不在列表中 观察者和提取者声明 Callback<ElectricDeviceType, Observable[]> deviceTypeExtractor = new Callback<ElectricDeviceType, Observable[]>() { @Override public Observable[] call(ElectricDevi

我在JavaFX中有一个ListView,当我删除一个项目时,会在ListView中显示更多的项目,但不在列表中

观察者和提取者声明

Callback<ElectricDeviceType, Observable[]> deviceTypeExtractor = new Callback<ElectricDeviceType, Observable[]>() {
    @Override
    public Observable[] call(ElectricDeviceType t) {
        return new Observable[] { t.maxValue, t.name, t.getDevices() };
    }
};
ObservableList<ElectricDeviceType> deviceTypes = FXCollections
        .observableArrayList(deviceTypeExtractor);    
回调设备类型提取器=新回调(){ @凌驾 公共可观察[]呼叫(电子设备类型t){ 返回新的可观察对象[]{t.maxValue,t.name,t.getDevices()}; } }; ObservableList deviceTypes=FXCollections .observableArrayList(设备类型提取器); 在这里,我将设备设置为ListView

    public void setElectricDevices(ElectricDeviceType... list) {
    deviceTypes.addAll(list);
    deviceTypeList.setItems(deviceTypes);
    deviceTypeList
            .setCellFactory(new Callback<ListView<ElectricDeviceType>, javafx.scene.control.ListCell<ElectricDeviceType>>() {
                @Override
                public ListCell<ElectricDeviceType> call(
                        ListView<ElectricDeviceType> listView) {
                    return new ElectricDeviceTypeListViewCell(_this,
                            simulation);
                }
            });
}
公共无效设置电气设备(电气设备类型…列表){
deviceTypes.addAll(列表);
deviceTypeList.setItems(deviceTypes);
设备类型列表
.setCellFactory(新回调函数(){
@凌驾
公用电话(
列表视图(列表视图){
返回新的ElectricDeviceTypeListViewCell(\u此,
模拟);
}
});
}
类ElectricDeviceTypeListViewCell

public class ElectricDeviceTypeListViewCell extends ListCell<ElectricDeviceType> {
private MainWindowController controller;
private Simulation simulation;

public ElectricDeviceTypeListViewCell(MainWindowController c, Simulation s) {
    controller = c;
    simulation = s;
}

@Override
public void updateItem(ElectricDeviceType t, boolean empty) {
    super.updateItem(t, empty);
    if (t != null) {
        ElectricDeviceTypeController data = new ElectricDeviceTypeController(controller, simulation);
        data.setInfo(t);
        setGraphic(data.getBox());
    }
}
公共类ElectricDeviceTypeListViewCell扩展ListCell{
专用主窗口控制器;
私有仿真;
公共电气设备TypeListViewCell(主窗口控制器c,模拟s){
控制器=c;
模拟=s;
}
@凌驾
public void updateItem(ElectricDeviceType t,布尔空){
super.updateItem(t,空);
如果(t!=null){
ElectricDeviceTypeController数据=新的ElectricDeviceTypeController(控制器,模拟);
数据集信息(t);
setGraphic(data.getBox());
}
}
}

当我从可观察列表中删除一项时,我的listview显示5项而不是2项。但我的可观察物品里面只有两个物品。如果我删除了我的所有项目,那么重复的项目也会被删除


您能帮我一下吗?

我想您应该更新您的
ElectricDeviceTypeListViewCell
,以便在更新时更改其单元格中的空值和
null
值:

@Override
public void updateItem(ElectricDeviceType t, boolean empty) {
    super.updateItem(t, empty);
    if(empty || t == null) {
      setGraphic(null);
      setText(null);
    }
    else {
        ElectricDeviceTypeController data = new ElectricDeviceTypeController(controller, simulation);
        data.setInfo(t);
        setGraphic(data.getBox());
    }
}

我想您应该更新您的
ElectricDeviceTypeListViewCell
,以便在更新时更改其单元格中的空值和
null
值:

@Override
public void updateItem(ElectricDeviceType t, boolean empty) {
    super.updateItem(t, empty);
    if(empty || t == null) {
      setGraphic(null);
      setText(null);
    }
    else {
        ElectricDeviceTypeController data = new ElectricDeviceTypeController(controller, simulation);
        data.setInfo(t);
        setGraphic(data.getBox());
    }
}

您不知道单元机制是如何实现的(即使您知道,也不应该依赖于保持不变的实现)。不能保证列表视图会将显示已删除项的同一单元格重新用于您添加的新单元格。请尝试建议的解决方案。谢谢,我试过了,它成功了:)你不知道细胞机制是如何实现的(即使你知道,你也不应该依赖于保持不变的实现)。不能保证列表视图会将显示已删除项的同一单元格重新用于您添加的新单元格。请尝试建议的解决方案。谢谢,我试过了,它成功了:)这已经回答了好几次了,(例如)。谢谢!这就是问题所在solution@James_D你提交评论时我已经在打字了。StackOverflow多线程出错;-)但您的回答是对的,这可能会被标记为重复。@eckig无需担心(因此搜索无法轻松找到解决方案)。是的,这些为讨论web应用程序的各种会话上下文策略提供了完美的示例:)。这已经回答了好几次了(例如)。谢谢!这就是问题所在solution@James_D你提交评论时我已经在打字了。StackOverflow多线程出错;-)但您的回答是对的,这可能被标记为重复。@eckig不必担心(因此搜索不会像可能的那样容易找到解决方案。)是的,这些为讨论web应用程序的各种会话上下文策略提供了完美的示例:)。