我正在使用JavaFX的TableView控件来显示我的表格数据。现在,由于数据量较大,当我尝试在控件中显示全部数据时会导致程序崩溃。请问是否有解决方法,或者我需要将数据缓存以便可以分块显示?应该使用JTable来替代吗?
我正在使用JavaFX的TableView控件来显示我的表格数据。现在,由于数据量较大,当我尝试在控件中显示全部数据时会导致程序崩溃。请问是否有解决方法,或者我需要将数据缓存以便可以分块显示?应该使用JTable来替代吗?
我使用CellFactory类在tableview上实现了懒加载... 我会尝试解释一下,如果有比我更好的英语,请编辑并使它更加易懂!
首先,我在Bean中使用一个必填属性来检查该Bean是否已经被加载。这样,我就不需要专门为此创建属性。
其次,我仅加载了我的Bean集合中的'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;
}
});
我不太确定我是否正确理解了你的问题,但是惰性加载项目怎么样?实际上,文档中直接有一个示例。虽然它是针对TreeView而不是TableView的,但是你应该能够简单地适应其背后的思想。
希望这可以帮助到你,至少对于我的TreeView来说,它解决了很多问题。
祝好, Regine