我正在使用 javafx 表视图控件来显示我的表数据。现在数据非常庞大,当我在控件中显示完整数据时它崩溃了。有什么方法可以这样做,或者我必须缓存数据以便我可以分块显示它。我应该改用 JTable 吗?
2 回答
我使用 CellFactory 类对 tableview 进行了延迟加载...我将尝试解释,任何英语比我更好的人都可以自由编辑并使其更易于理解!
首先,我在 Bean 中使用强制属性来检查该 bean 是否已经加载。这样我就不需要专门为此创建一个属性。
其次,我将我的 Bean 集合加载到 TableView 中,只是加载了 'id' 属性,这使我的表格全部显示为空白。
最后,我创建了一个 CellFactory,如下所示,检查对象是否已加载,如果没有,请立即执行。
namecolumn.setCellFactory(new Callback<TableColumn<PersonBean, String>, TableCell<PersonBean, String>>() {
@Override
public TableCell<PersonBean, String> call(TableColumn<PersonBean, String> param) {
TableCell<PersonBean, String> newtablecell = new TableCell<PersonBean, String>() {
@Override
protected void updateItem(String item, boolean empty) {
// Since I got some strange errors when method getIndex() return greatter value than my collection size, I need to validate before getting the object
if (getIndex() < getItems().size()) {
//Retrieve the collection object
PersonBean personbean = getItems().get(getIndex());
// Name is mandatory, so if it is null my bean was not loaded yet
if (personbean.getName() == null) {
// Call other centralized method to make load, details explained later
loadPersonBean(personbean);
}
// Now I put the value on TableCell. Remember "item" still empty so we need to use Bean
setText(personbean.getName());
setAlignment(Pos.CENTER);
}
}
};
return newtablecell;
}
});
在 loadPersonBean 方法中,我传递 TableView Collection 中包含的对象并从数据库中加载它。比我将所有需要的数据复制到从表中接收到的 bean 中。我没有尝试在 TableView 中交换对象,但我相信它可能会导致并发异常。
其他观察:在我所有的测试中,TableView 总是尊重列顺序来调用我的 CellFactory,但我没有测试如果用户交换列顺序,它是否仍然尊重顺序。所以我更喜欢将带有“LazyLoadCheck”部分代码的 CellFactory 添加到所有列。
希望我让自己足够清楚以提供帮助!如果还有任何问题,请发表评论,我会尽力做出更好的解释。
我不太确定我是否正确理解了您的问题,但是延迟加载项目呢?实际上Docs 中直接有一个示例。虽然它适用于 TreeView 而不是 TableView,但您应该能够简单地适应背后的想法。
希望对我的TreeView有所帮助,到目前为止它解决了很多问题。
干杯,雷吉娜