JavaFX TableView 性能问题

8

我正在使用JavaFX的TableView控件来显示我的表格数据。现在,由于数据量较大,当我尝试在控件中显示全部数据时会导致程序崩溃。请问是否有解决方法,或者我需要将数据缓存以便可以分块显示?应该使用JTable来替代吗?


2
自己实现表格视图分页并按块加载数据。 - Uluk Biy
2
JavaFX内置了分页控件,但是(对于JavaFX2.2),核心代码(或我所知道的第三方库)中没有将分页控件与JavaFX TableView连接在一起的代码,因此您需要自己处理这部分。 - jewelsea
谢谢大家的意见,我猜等Oracle的人也没什么用。我应该自己实现它。再次感谢! - Aakash
如果你写过一些代码来实现这个,我会非常感兴趣! - reyman64
@reyman64 尽管我尝试了很多方法,但 TableView 提供的速度并没有让我满意,因此我使用了 Swing 中的 JTable,它更快。现在我会坚持使用它。 - Aakash
显示剩余2条评论
2个回答

4

我使用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;
  }
});

在loadPersonBean方法中,我传递了TableView集合中包含的对象,并从数据库中加载它。然后将所有所需数据复制到从表格接收到的bean中。我没有尝试交换TableView中的对象,但我相信这可能会导致并发异常。
其他观察:在我所有的测试中,TableView始终尊重调用我的CellFactory的列顺序,但我没有测试如果用户交换了列顺序,它是否仍然尊重顺序。因此,我更喜欢为所有列添加一个带有“LazyLoadCheck”代码的CellFactory。
希望我表达得足够清楚以帮助你!如果还有问题,请留言,我将尝试做出更好的解释。

0

我不太确定我是否正确理解了你的问题,但是惰性加载项目怎么样?实际上,文档中直接有一个示例。虽然它是针对TreeView而不是TableView的,但是你应该能够简单地适应其背后的思想。

希望这可以帮助到你,至少对于我的TreeView来说,它解决了很多问题。

祝好, Regine


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接