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
方法必须:
- 总是调用
super.updateItem()
,并且
- 更新单元格的状态,使其对于
item
和empty
的任何可能值保持一致
(参见 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);
}
}
我有一个 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
方法必须:
- 总是调用
super.updateItem()
,并且 - 更新单元格的状态,使其对于
item
和empty
的任何可能值保持一致
(参见 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);
}
}