Javafx:在updateItem之后刷新TreeTableView

时间:2017-05-11 13:04:44

标签: javafx javafx-8 tablecell treetableview

我有一个TreeTableView我有一个自定义的TreeTableCell,我在其中覆盖updateItem方法,以便根据某些条件渲染我的单元格(设置为禁用或启用)。问题是如果我做了一些滚动,表格不刷新,正如你在附加图像上看到的那样,即使它们不满足条件,一些单元格也会被禁用。重度滚动后,所有单元格都将被禁用(灰显)。我尝试了两件事来解决问题:  添加一些事件监听器以“手动”刷新表格,如:

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);
    }
}

1 个答案:

答案 0 :(得分:1)

您的updateItem方法必须:

  1. 始终致电super.updateItem()
  2. 更新单元格的状态,使其与itemempty
  3. 的任何可能值保持一致

    (参见Cell documentation。)

    在您的代码中,如果单元格用于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);
        }
    }