JavaFX TableView性能问题

时间:2012-08-22 08:12:06

标签: java performance javafx javafx-2 tableview

我正在使用javafx表视图控件来显示我的表数据。现在数据非常庞大,当我在控件中显示完整数据时,它会崩溃。有没有办法这样做或者我必须缓存数据,以便我可以以块的形式显示它。我应该使用JTable吗?

2 个答案:

答案 0 :(得分:4)

我使用CellFactory类在tableview上做了一个懒惰的工作......我试着解释一下,任何英语比我更好的人都可以免费编辑并让它更容易理解!

首先,我在Bean中使用强制属性来检查是否已经加载了该bean。这样我就不需要专门为此创建属性了。

其次,我加载了TableView我的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 Collection中包含的对象并从DataBase加载它。比我将所有需要的数据复制到从表中收到的bean。我没有尝试在TableView中交换对象,但我相信它可能会导致并发异常。

其他观察:在我的所有测试中,TableView总是尊重列顺序来调用我的CellFactory,但是如果用户交换列顺序,我没有测试它是否仍然遵守顺序。所以我更喜欢在所有列中添加一个带有“LazyLoadCheck”代码部分的CellFactory。

希望我能够清楚地帮助自己!如果仍有任何问题,请发表评论,我会尝试做出更好的解释。

答案 1 :(得分:0)

我不太确定我是否理解你的问题,但是延迟加载项目呢?实际上有一个example within the Docs directly。虽然它适用于TreeView而不适用于TableView,但您应该能够简单地调整背后的想法。

希望有帮助,至少在我的TreeView中,它解决了很多问题到目前为止。

干杯, 雷吉娜贝拉