2016-04-03 17 views
1

Birkaç Etiket denetiminden oluşan özel bir kontrolüm var: tarih, başlık, metin vb. Denetimde fxml dosyası ve denetleyici var. Bu denetimi bir ListView hücresi olarak kullanmak istiyorum. Ben JavaFx 8'de liste görünümündeki özel denetim 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); 
     } 

    } 
} 

ListCell

özel bir yarattı Ama bunu yapmak için doğru bir yol olduğundan emin değilim. Uygulamamdaki ListView, binlerce öğeye sahip olabilir. Her hücre güncellemesiyle ilgili anlayışımda, grafik Düğüm oluşturulmadan önce fxml yüklemesi, ayrıştırma ve diğer işlemleri yapması gerekecektir. Bu sorunu çözmek için daha iyi bir yolu var mı?

cevap

2

Yük her bir hücre için bir kere FXML ve sadece updateItem(...) yönteminde ihtiyaç olarak yapılandırın: Ben FXML dosyası bir kontrolör sınıfı NoteController beyan olduğunu varsayıyorum

İşte
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); 
     } 

    } 
} 

ve yöntemlerini tanımlamak o İçinde belirli bir Note için UI yapılandırmak için ihtiyacınız var.

Bu şekilde, FXML, oluşturulan her hücre için yalnızca bir kez yüklenir (bu, listede kaç öğe olursa olsun 20'den fazla olmayacaktır) ve güncelleştirmek için (nispeten verimli) yöntemler vardır. Kullanıcı kaydırdığında veya hücreler yeniden kullanıldığında gerektiğinde çağrılır.