【问题标题】:JavaFX Table view Cell ReuseJavaFX 表视图单元重用
【发布时间】:2017-03-26 12:15:01
【问题描述】:

我有一个带有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 中,实际值将根据 @987654332 加载@ 与当前列关联。

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

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

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

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

请帮助解决这个问题:)

【问题讨论】:

    标签: javafx tableview


    【解决方案1】:

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

    但是,您可以轻松地为此 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);
            }
    
        };
    }
    

    【讨论】:

    • 很好,updateIndex 是我正在寻找的功能。甚至已经覆盖了 eventdispatcher 来检查我是否可以对那里的重用做出反应 xD。感谢您的快速答复:)
    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多