2016-04-03 14 views
1

私は、日付、タイトル、テキストなど、いくつかのラベルコントロールからなるカスタムコントロールを持っています。コントロールにはfxmlファイルとコントローラがあります。このコントロールをListViewのセルとして使用したいと思います。カスタムListCellを作成しましたJavaFx 8のリストビューセルのカスタムコントロールfxml

public class NoteTextCell extends ListCell<Note>{ 
//.... 
    protected void updateItem(Note note, boolean isEmpty){ 
     if(isEmpty|| note == null){ 
     //.... 
     } 
     else { 
      FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/note.fxml")); 
      Node node = loader.load(); 
      setGraphic(node); 
     } 

    } 
} 

しかし、正しい方法はわかりません。私のアプリのListViewは、潜在的に何千ものアイテムを持つことができます。私が理解しているすべてのセルの更新では、グラフィカルなノードが作成される前に、fxmlを読み込み、解析やその他の操作を行う必要があります。この問題を解決する良い方法はありますか?

答えて

2

各セル毎に一度FXMLをロードし、そしてあなたがupdateItem(...)方法で必要とそれを構成する:

public class NoteTextCell extends ListCell<Note>{ 

    private final Node graphic ; 
    private final NoteController controller ; 

    public NoteTextCell() throws IOException { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("fxml/note.fxml")); 
     graphic = loader.load(); 
     controller = loader.getController(); 
    } 

    @Override 
    protected void updateItem(Note note, boolean isEmpty){ 
     if(isEmpty|| note == null){ 
      setGraphic(null); 
     } 
     else { 
      // configure based on note: 
      controller.setText(...); 
      controller.setXXX(...); 
      setGraphic(graphic); 
     } 

    } 
} 

ここで私はFXMLファイルは、コントローラクラスNoteControllerを宣言することを想定していますし、あなたがメソッドを定義することその中で特定のUIを設定するために必要なのはNoteです。

このようにして、FXMLは作成されたセルごとに1回だけロードされます(リスト内の項目数にかかわらず20個以下になる可能性があります)。ユーザーがスクロールしたり、セルが他の方法で再利用されたりすると、必要に応じて呼び出されます。

関連する問題