2016-05-02 129 views
1

我想在ListView中製作一個自定義單元格。請原諒我英語不好! 我想在ListView中顯示圖片,名稱和狀態。 對此,我使用不同的Fxml,其中包含Hbox如何使用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文件使用不同的控制器類。通過使用代碼,所有單元格都使用相同的控制器實例,因此每個控件只有一個引用,即使有許多labelName等等(每個單元格都有一個)。

所以定義爲表單元格定義的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); 
     } 
    } 
}); 
相關問題