JavaFX表视图单元重用

JavaFX表视图单元重用,javafx,tableview,Javafx,Tableview,我有一个带有TableView的javafx应用程序。只有第一列(dataTypeColumn)是可编辑的,它包含一个用于编辑的组合框。现在,TableView做了它应该做的事情,但是当我开始编辑一个单元格,然后在没有提交编辑的情况下将其从视图中滚动出来时,会出现一些奇怪的错误。我很确定这是因为TableView重用单元格的方式。然而,我还没有找到任何干预的方法,例如禁止重用当前正在编辑的单元格。你能帮我吗 尽管我很确定这是因为单元重用,但我将在下面写下整个问题,以防问题的根源是不同的 该列包含

我有一个带有
TableView
的javafx应用程序。只有第一列(
dataTypeColumn
)是可编辑的,它包含一个用于编辑的组合框。现在,
TableView
做了它应该做的事情,但是当我开始编辑一个单元格,然后在没有提交编辑的情况下将其从视图中滚动出来时,会出现一些奇怪的错误。我很确定这是因为
TableView
重用单元格的方式。然而,我还没有找到任何干预的方法,例如禁止重用当前正在编辑的单元格。你能帮我吗

尽管我很确定这是因为单元重用,但我将在下面写下整个问题,以防问题的根源是不同的

该列包含枚举
数据类型的值
我为该专栏创建了一个单元格工厂,如下所示:

dataTypeColumn.setCellFactory(param -> new ComboBoxTableCell<>(DataType.values()));
public void editCommited(TableColumn.CellEditEvent<Integer, DataType> event) {
        //configuration is an ObservableList containing DataType elements
        configuration.set(event.getRowValue(), event.getNewValue());
    }
为了避免混淆,我给我的
TableView
的项目是
整数
(从0到n-1),在不同的列
CellValueFactorys
中,实际值将根据与当前列关联的
整数
加载

因此,在编辑它时,它会显示一个包含
数据类型
可以拥有的所有值的
组合框
,让用户选择一个。我在列上有一个回调,它对Edit Committed事件作出反应,如下所示:

dataTypeColumn.setCellFactory(param -> new ComboBoxTableCell<>(DataType.values()));
public void editCommited(TableColumn.CellEditEvent<Integer, DataType> event) {
        //configuration is an ObservableList containing DataType elements
        configuration.set(event.getRowValue(), event.getNewValue());
    }
public void editCommited(TableColumn.CellEditEvent事件){
//配置是包含数据类型元素的可观察列表
set(event.getRowValue(),event.getNewValue());
}
因此,关于发生的问题。开始时,该列中的所有单元格都具有相同的值:“未选择任何内容”。它是为这种情况保留的枚举的一个特殊值,因为我在
ComboxTableCell
类中没有找到setPlaceholder函数。当我知道开始编辑其中一个单元格,然后将其滚动出视图时,下一行中的一行也会突然处于编辑状态,即使该行以前从未被触摸过。如果我再滚动一次,每次前一个单元格滚动出视图时,都会出现一个处于编辑状态的单元格。我也可以回去,在编辑状态下找到相同的单元格。如果编辑不应处于编辑状态的单元格,它将不会更改,但我最初尝试编辑的单元格将更改其值。这可能是由于下面的
ObservableList
,它会自动更新列中的值

如果我开始编辑具有不同值的单元格(与以前的编辑不同),则会发生更奇怪的事情。当再次将其滚动出视图时,新行将在编辑页面中有一个单元格,但默认值为“nothing selected”。如果我向后滚动,我最初尝试编辑的单元格将不再处于编辑状态,但其值已更改为“未选择任何内容”。好像获得编辑状态的新单元格以某种方式提交了它自己的值


请提供一些帮助:)

这似乎确实是一个bug。令人惊讶的是,如果您用鼠标移动滚动条,编辑将正确取消,但如果您使用鼠标滚轮滚动,则编辑不会取消

但是,您可以轻松地为此buf创建一个解决方案,因为在替换项目时,您只需取消编辑即可。例如,您可以使用此方法自行创建
cellFactory

public static <S, T> Callback<TableColumn<S, T>, TableCell<S, T>> comboBoxCellFactory(ObservableList<T> items) {
    if (items == null) {
        throw new IllegalArgumentException();
    }
    return column -> new ComboBoxTableCell<S, T>(items) {

        @Override
        public void updateIndex(int i) {
            cancelEdit();
            super.updateIndex(i);
        }

    };
}
公共静态回调ComboxCellFactory(可观察列表项){
if(items==null){
抛出新的IllegalArgumentException();
}
返回列->新建ComboxTableCell(项目){
@凌驾
公共无效更新索引(int i){
取消编辑();
超级更新索引(i);
}
};
}

Nice,updateIndex是我搜索的函数。甚至已经重写了eventdispatcher,以检查我是否能够对重用xD做出反应。谢谢你的快速回答:)