【发布时间】:2014-04-17 18:42:26
【问题描述】:
我正在编写一个使用 JavaFX8 TreeTableView 的应用程序。树形表有三列,其中两列是字符串属性(name 和 value),另一列有一个 Canvas 小部件,它从来自数据库(波形)。应用程序上还有一个控件,允许缩小或缩小(或左右滚动)显示(所有图纸)。
name 和 value 列使用来自我的数据模型的 StringProperty 值,因此为这些列设置了 CellValueFactory。绘图列同时使用 CellFactory 和 CellValueFactory,如下所示:
// Waveform column
TreeTableColumn<DrawRow, WaveformTraceBox> waveColumn = new TreeTableColumn<>();
waveColumn.setCellFactory(new Callback<TreeTableColumn<DrawRow, WaveformTraceBox>, TreeTableCell<DrawRow, WaveformTraceBox>>() {
@Override
public TreeTableCell<DrawRow, WaveformTraceBox> call(TreeTableColumn<DrawRow, WaveformTraceBox> param) {
return new WaveformTraceBoxTreeTableViewCell<>();
}
});
waveColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<DrawRow, WaveformTraceBox>, ObservableValue<WaveformTraceBox>>() {
@Override
public ObservableValue<WaveformTraceBox> call(TreeTableColumn.CellDataFeatures<DrawRow, WaveformTraceBox> param) {
return new ReadOnlyObjectWrapper<>(new WaveformTraceBox());
}
});
WaveformTraceBoxTreeTableViewCell 在哪里:
protected static class WaveformTraceBoxTreeTableViewCell<T> extends TreeTableCell<DrawRow, T> {
public WaveformTraceBoxTreeTableViewCell() {
super();
}
@Override
protected void updateItem(T value, boolean empty) {
super.updateItem(value, empty);
setText(null);
setGraphic(null);
if (!empty && getTreeTableRow().getItem() != null) {
getTreeTableRow().getItem().setTraceBox((WaveformTraceBox)value);
setGraphic((WaveformTraceBox) value);
}
}
DrawRow 是我的数据模型。当用户通过窗口上的控件缩小或缩小时,绘制行模型将通知其关联的 Canvas 绘图项以重新绘制其显示。由于生成显示需要处理大量数据,因此显示的绘制可能需要一些时间。
现在我的问题是:当 TreeTableView 小部件滚动时,它会要求新的 Canvas 小部件——这些小部件与数据模型中的 DrawRow 项相关联。但是,列表中滚动到屏幕外的小部件将被树小部件丢弃。
我无法判断我正在使用的物品是否已被丢弃或不再使用。因此,代码所做的工作比它需要的要多得多,因为它试图绘制不再使用或显示的单元格。我认为最终这会因为垃圾收集而导致其他问题。
所以我真正的问题是如何判断一个单元格是否已被树表遗弃,以便我可以停止尝试更新它?对此的任何帮助将不胜感激。在我所做的各种网络搜索中,我无法在任何地方找到它。
【问题讨论】: