我正在编写一个使用 JavaFX8 TreeTableView 的应用程序。树表有三列,其中两列是字符串属性(名称和值),另一列有一个 Canvas 小部件,它从数据库(波形)的数据中绘制图片。应用程序上还有一个控件,可以缩小或缩小(或左右滚动)显示(所有图纸)。
名称和值列使用我的数据模型中的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 项目相关联。但是,列表中滚动到屏幕外的小部件将被树小部件丢弃。
我没有办法判断我正在使用的物品是被扔掉还是不再被使用。因此,代码所做的工作比它需要的要多得多,因为它试图绘制不再使用或显示的单元格。最终这将导致其他问题,因为我认为垃圾收集。
所以我真正的问题是如何判断一个单元格是否已被树表遗弃,以便我可以停止尝试更新它?对此的任何帮助将不胜感激。在我所做的各种网络搜索中,我无法在任何地方找到它。