2012-08-22 22 views
7

javafxテーブルビューコントロールを使用してテーブルデータを表示しています。今ではデータが非常に巨大で、コントロール内のすべてのデータを表示するとクラッシュします。これを行う方法はありますか、データをキャッシュしてチャンクに表示する必要がありますか?代わりにJTableを使うべきですか?JavaFX TableViewパフォーマンスの問題

+2

テーブルビューのページ付けを実装し、データをチャンクにロードします。 –

+0

JavaやJavaFxでこれを行うライブラリやapiはすでに開発されていますか? – AsG

+0

Swingにはサードパーティ製のapiがあるかもしれませんが、AFAIKにはJavaFX用にnoがあります。実際にはあなたの環境によって異なります。たとえば、JPAにはページ単位のクエリなどがあります。ビュー部分は実装するのが難しくありません。 –

答えて

0

私はあなたの質問を正しく理解しているかどうかはわかりませんが、アイテムの遅延読み込みはどうでしょうか?実際にはexample within the Docs directlyがあります。それはTreeViewのものであり、TableViewのものではありませんが、単純にその考え方を適用することができます。

私のツリービューでは、少なくともこれまでに多くの問題を解決するのに役立つと思っています。

乾杯、 レギーネ

+0

ありがとう、私はそれを通過します... – AsG

3

私はCellFactoryクラスを使用してテーブルビューにレイジーロードを作った... - 私は私が編集し、それをより理解しやすくすること自由に落ちたよりも、より良い英語で誰を説明しよう!

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

第2に、TableViewに「id」プロパティをロードしただけで私のBeanコレクションをロードしました。なぜなら、私のテーブルの表示はすべて空白になります。

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

希望私は助けに十分な私の自己を作った!ご質問が残っている場合は、コメントと私はより良い説明をしようとします。