2016-05-02 21 views
1

Ich möchte eine benutzerdefinierte Zelle in der ListView machen. Entschuldige mein schlechtes Englisch! Ich möchte das Bild, Name und Status in der ListView anzeigen. Dazu verwende ich eine andere Fxml, die Hbox enthält.Wie fxml mit benutzerdefinierter Zelle in einem ListView herunterladen?

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

Bitte klären, was das spezifische Problem ist –

+0

Haben Sie bereits die verwandten Links auf der rechten Seite, z http://stackoverflow.com/questions/19588029/customize-listview-in-javafx-with-fxml?rq=1? – jns

+0

@NoamHacker Ich wollte wissen, ob ich fxml korrekt lade. Vielleicht gibt es eine andere Möglichkeit, benutzerdefinierte Zellen zu erstellen. – Poks

Antwort

1

Als allgemeine, Regel sollten Sie eine andere Controller-Klasse für jede FXML-Datei verwenden. Mit dem Code, den Sie haben, verwenden alle Zellen die gleiche Controller-Instanz, daher gibt es nur einen Verweis auf jedes Steuerelement, obwohl es viele labelName s usw. gibt (einen für jede Zelle).

So eine Steuerung für die FXML definieren für die Liste Zelle definiert, und definieren Sie die Methoden, die Sie die Steuerelemente aktualisieren müssen:

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); 
    } 
} 

Aktualisieren Sie die FXML Datei einen Controller Attribut mit fx:controller="my.package.ContactCellController" zu verwenden, und dann Zellimplementierung kann wie aussehen