我有一个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);
}
}
答案 0 :(得分:1)
您的updateItem
方法必须:
super.updateItem()
和item
和empty
(参见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);
}
}