当前位置: 首页 > 知识库问答 >
问题:

JavaFX表视图单元重用

倪鸿禧
2023-03-14

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

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

列的值如下所示:

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

如果这是混淆的,我为tableView提供的项是整数(从0到n-1),在不同的列CellValueFactory中将根据与当前列相匹配的整数加载实际值。

因此,在编辑它时,它会显示一个组合框,其中包含datatype可以包含的所有值,让用户选择一个。我对该列有一个回调,它对Edit commited事件做出反应,如下所示:

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

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

请提供帮助:)

共有1个答案

滕祯
2023-03-14

这似乎确实是一个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);
        }

    };
}
 类似资料:
  • 我在tableview中使用的一列有问题<本栏最初用于显示我拥有的一种数据类型: 我想更改此列中显示的数据,因此我更改了FXML文件中的列名,并编写了以下内容: 我的ResearchData类编码如下: (我只保留了rang、luse和lSysteme,但我有很多其他变量都是这样写的)。 当我启动程序时,在tableview中,除Systeme列外,所有列都正确显示,我收到了以下错误消息: 我可以

  • 问题内容: 我试图让表单元格在创建新行时显示字符串。但是所有行都是空的。有人知道我在做什么错吗?这是主要的类:包应用程序; 这是正常的并且可以正常工作,所以我认为您不必为此担心。 这是控制器类。我认为问题可能出在哪里。 这也是tableviewer所需的表类 你们知道什么地方可能出错,或者建议我如何只添加tableviewer,使其代码仍可与SceneBuilder中的其余fxml文件一起使用?

  • 我正在使用javafx tableview和observableList,我试图防止List包含重复的项目。在做了一些搜索之后,我发现一个observableSet可以通过覆盖这些方法来完成这项工作:equals()和hashcode()。 但是javaFX tableview不能保存可观察集的问题: 我还计划计算tableview中a列的some,所以我需要 我真的对正确的方法感到困惑。所以,我

  • 我希望我的swift代码在每次按下按钮时都添加一个新的tableview单元格。你可以在下面的gif中看到我想要的东西。这段代码应该在func-tableView(_tableView:UITableView,cellForRowAt-indexPath:indexPath)中添加按钮- 在此输入图像描述

  • 因此,我试图学习如何使用JavaFx Tableview,无意中看到了以下教程: Oracle tableview教程 在本教程中,它们说明了为了填充tableView,您必须使用字符串填充它,但不只是任何字符串您必须将格式化为 现在我对JavaFx还很陌生,但这是否意味着当我创建一个对象时,我必须格式化所有的整数和字符串,以填充我的TableView?这似乎很愚蠢,但也许有更高的目的?还是有办法

  • 我的TableView包含一些数字数据。当我说按按钮编辑值时,它会将单元格的背景更改为绿色。当没有足够的行使表格可滚动时,这种方法很有效。一旦表格变成(或从一开始就是)可滚动的,它就会开始表现出怪异的行为。它会更改已编辑项目的背景,但也会更改在向下滚动之前不可见的项目的背景。然而,当我调试时,更改背景的代码只被调用一次。我认为它与tableview有关,当is scrollable破坏并重新创建单