0

我有一个TreeTableView并且我有一个自定义 TreeTableCell ,我在其中重写了该updateItem方法,以便根据某些条件呈现我的单元格(设置为禁用或启用)。问题是,如果我进行一些滚动,表格不会刷新,并且正如您在附加图像中看到的那样,即使某些单元格不满足条件,它们也会被禁用。大量滚动后,所有单元格都被禁用(灰显)。我尝试了两件事来解决问题:添加一些事件侦听器以“手动”刷新表,例如:

treeTable.addEventFilter(ScrollEvent.ANY, event -> treeTable.refresh());

渲染问题消失了,但是如果我进行更重的滚动,它会变得如此滞后,就像应用程序以 10-15 fps 运行一样,因为刷新事件触发得太频繁了。我尝试过的另一件事是java.util.Timer在滚动时创建一个 timer() 来触发刷新,例如每 50 毫秒触发一次刷新。然后滞后消失,但渲染单元格有延迟,因此您可以观察单元格颜色从灰色到白色的变化。如果我选择较小的时间间隔,它会变得滞后,并且我无法在滞后和延迟之间找到平衡,而且我还认为我的两个解决方案都只是解决方法,而不是问题的真正解决方案。


你有其他想法来解决这个问题吗?

附图:TableCells

@Override
public void updateItem(Boolean item, boolean empty) {
    MyCustomRow row = getTreeTableRow().getItem();
    if (row != null && row.isCondition()) {
        editableProperty().set(false);
        super.updateItem(item, empty);
    }
}
4

1 回答 1

1

您的updateItem方法必须:

  1. 总是打电话super.updateItem(),并且
  2. 更新单元格的状态,使其与和的任何可能值保持一致itemempty

(请参阅Cell文档。)

在您的代码中,如果单元格用于isCondition返回的行true,然后再用于isCondition返回的行false,则不会将该editable属性恢复为true. (因此,最终,所有单元格都可以更改为不可编辑,但永远不能更改回可编辑。)

你应该做类似的事情

@Override
public void updateItem(Boolean item, boolean empty) {
    super.updateItem(item, empty);
    MyCustomRow row = getTreeTableRow().getItem();
    if (row != null && row.isCondition()) {
        setEditable(false);
    } else {
        setEditable(true);
    }
}
于 2017-05-11T14:10:18.553 回答