JavaFX表视图单元重用

时间:2016-11-12 10:37:47

标签: javafx tableview

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

即使我很确定这是因为细胞重用,我会在下面写下整个问题,以防问题的根源不同。

相关列包含枚举DataType的值 我有一个单元格工厂,如下所示:

dataTypeColumn.setCellFactory(param -> new ComboBoxTableCell<>(DataType.values()));

列的值如下所示:

dataTypeColumn.setCellValueFactory(param -> Bindings.valueAt(configuration, param.getValue()));

如果这令人困惑,我向TableView提供的项目为Integers(从0到n-1),而在不同的列CellValueFactories中,实际值将是加载取决于与当前列相关的Integer

因此,在编辑时,它会显示ComboBox,其中包含DataType可以拥有的所有值,并让用户选择一个。我在列上有一个回调,它对Edit commited事件作出反应,如下所示:

public void editCommited(TableColumn.CellEditEvent<Integer, DataType> event) {
        //configuration is an ObservableList containing DataType elements
        configuration.set(event.getRowValue(), event.getNewValue());
    }

关于发生的问题。在该开始,该列中的所有单元格具有相同的值:“未选择任何内容”。它是为这种情况保留的枚举的特殊值,因为我没有在ComboBoxTableCell类上找到setPlaceholder函数。当我知道开始编辑其中一个单元格然后将其滚出视图时,下一行中的一行也将处于编辑状态,即使之前没有触及该行。如果我进一步滚动,则每当前一个单元格滚出视图时,将出现处于编辑状态的单元格。我也可以返回并在编辑状态下找到相同的单元格。如果我编辑不应处于编辑状态的单元格,它将不会更改,而是我最初尝试编辑的单元格将更改其值。这可能是由于基础ObservableList,它会自动更新列中的值。

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

请帮忙解决这个问题:)

1 个答案:

答案 0 :(得分:3)

这确实是一个错误。相当令人惊讶的是,如果使用鼠标移动滚动条,则编辑会被正确取消,但如果您使用鼠标滚轮滚动则不能取消。

您可以轻松地为此buf创建变通方法,因为您只需在替换项目时取消编辑。你可以,例如使用此方法自行创建$stateParams

cellFactory