Javafx:TreeTableView 在 updateItem 后刷新

Javafx : TreeTableView refresh after updateItem

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

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

渲染问题消失了,但如果我滚动得更重一些,它就会变得很慢,就像应用程序以 10-15 fps 运行一样,因为刷新事件触发得太频繁了。 我尝试过的另一件事是制作一个计时器(java.util.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);
    }
}

您的 updateItem 方法必须:

  1. 总是调用super.updateItem(),并且
  2. 更新单元格的状态,使其对于itemempty
  3. 的任何可能值保持一致

(参见 Cell documentation。)

在您的代码中,如果单元格用于 isCondition returns true 的行,然后又用于 isCondition [=41 的行=] 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);
    }
}