2016-05-02 29 views
1

ListViewにカスタムセルを作りたいと思います。私の悪い英語を間違えて! ListViewに画像、名前、ステータスを表示します。 これにはHboxを含む別のFxmlを使用します。ListViewでカスタムセルを使ってfxmlをダウンロードする方法は?

public class Controller {  
    CollectionContactForListCollection contactForList = new CollectionContactForListCollection(); 
@FXML 
private ListView<Contact> listContact ; 
@FXML 
HBox hbox; 
@FXML 
ImageView avatar; 
@FXML 
Label labelName; 
@FXML 
Label lblStatus; 
@FXML 
Label lblSense; 

@FXML 
private void initialize(){ 
    contactForList.fieldData(); 
    // listContact.setItems((ObservableList)  contactForList.getContactList()); 
    listContact.setCellFactory(new Callback<ListView<Contact>, ListCell<Contact>>() { 
     @Override 
     public ListCell<Contact> call(ListView<Contact> param) {    
      ListCell<Contact> listCell = new ListCell<Contact>() {      
       @Override 
       protected void updateItem(Contact item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty || item == null) { 
         setText(null); 
         setGraphic(null); 
        } else { 
         //This method does not work download       
         FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/boxInContact.fxml")); 
         fxmlLoader.setController(this);      
         labelName.setText(item.getName()); 
         lblSense.setText(item.getSense()); 
         lblStatus.setText(item.getStatus()); 
         avatar.setImage(item.getImage());        
        } 
       } 
      }; 
      return listCell; 
     } 
    }); 
    listContact.setItems((ObservableList) contactForList.getContactList()); 
} 
+0

具体的な問題点を明確にしてください。 –

+0

右の関連リンクを既に確認しましたか? http://stackoverflow.com/questions/19588029/customize-listview-in-javafx-with-fxml?rq=1? – jns

+0

@NoamHacker fxmlを正しく読み込むかどうかを知りたかったのです。カスタムセルを作成する別の方法があるかもしれません。 – Poks

答えて

1

通常、ルールとして、FXMLファイルごとに異なるコントローラクラスを使用する必要があります。あなたが持っているコードでは、すべてのセルが同じコントローラインスタンスを使用しているので、各セルに1つずつ、labelNameなどがあるにもかかわらず、各コントロールへの参照は1つだけです。

だから、リストセル用に定義されたFXMLためのコントローラを定義し、あなたがコントロールを更新する必要があるメソッドを定義します。

public class ContactCellController { 

    @FXML 
    private Label labelName ; 
    @FXML 
    private Label labelStatus ; 
    @FXML 
    private Label labelSense ; 
    @FXML 
    private ImageView avatar ; 

    public void setName(String name) { 
     labelName.setText(name); 
    } 

    public void setStatus(String status) { 
     labelStatus.setText(status); 
    } 

    public void setSense(String sense) { 
     labelSense.setText(sense); 
    } 

    public void setAvatarImage(Image image) { 
     avatar.setImage(image); 
    } 
} 

fx:controller="my.package.ContactCellController"で、コントローラの属性を使用するようにFXMLファイルを更新した後、あなたのセルの実装は次のようになります

listContact.setCellFactory(lv -> new ListCell<Contact>() { 
    private Node graphic ; 
    private ContactCellController controller ; 

    { 
     try { 
      FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/boxInContact.fxml")); 
      graphic = loader.load(); 
      controller = loader.getController(); 
     } catch (IOException exc) { 
      throw new RuntimeException(exc); 
     } 
    } 

    @Override 
    protected void updateItem(Contact contact, boolean empty) { 
     super.updateItem(contact, empty); 
     if (empty) { 
      setGraphic(null); 
     } else { 
      controller.setName(contact.getName()); 
      controller.setStatus(contact.getStatus()); 
      controller.setSense(contact.getSense()); 
      controller.setAvatarImage(contact.getImage()); 
      setGraphic(graphic); 
     } 
    } 
}); 
関連する問題