8

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

4

2 回答 2

4

我使用 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 添加到所有列。

希望我让自己足够清楚以提供帮助!如果还有任何问题,请发表评论,我会尽力做出更好的解释。

于 2012-10-26T00:18:31.260 回答
0

我不太确定我是否正确理解了您的问题,但是延迟加载项目呢?实际上Docs 中直接有一个示例。虽然它适用于 TreeView 而不是 TableView,但您应该能够简单地适应背后的想法。

希望对我的TreeView有所帮助,到目前为止它解决了很多问题。

干杯,雷吉娜

于 2012-08-23T14:14:53.323 回答