8

テーブル データを表示するために javafx テーブル ビュー コントロールを使用しています。現在、データは非常に巨大で、コントロールに完全なデータを表示するとクラッシュします。そうする方法はありますか、それともチャンクで表示できるようにデータをキャッシュする必要がありますか。代わりに JTable を使用する必要がありますか?

4

2 に答える 2

4

私はCellFactoryクラスを使用してテーブルビューに遅延ロードを作成しました...説明しようとします。私よりも英語が上手な人は誰でも自由に編集して、より理解しやすくすることができます!

まず、Bean の必須プロパティを使用して、その Bean が既にロードされているかどうかを確認します。このようにして、そのために特別に属性を作成する必要はありません。

次に、「id」プロパティがロードされた状態で Bean コレクションを TableView にロードしたため、テーブルがすべて空白で表示されます。

最後に、以下のような 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 をすべての列に追加することを好みます。

私が助けるのに十分なほど自分自身を明確にしたことを願っています! ご不明な点がございましたら、コメントいただければ、より適切な説明を行います。

于 2012-10-26T00:18:31.260 に答える
0

あなたの質問を正しく理解しているかどうかはよくわかりませんが、アイテムの遅延読み込みはどうですか? 実際には、ドキュメント内に直接例があります。これは TreeView 用であり、TableView 用ではありませんが、背後にあるアイデアを簡単に適応させることができるはずです。

少なくとも私の TreeView については、これまでに多くの問題を解決できたことを願っています。

乾杯、レギネ

于 2012-08-23T14:14:53.323 に答える