2016-07-20 7 views
0

Ich habe eine Klasse mit ein paar Werten (ListItem), und ich möchte eine Liste dieser Elemente anzeigen (ListView<ListItem>). ListItem hat eine value Eigenschaft, die ich gerne die ListView<ListItem> als Text anzeigen würde, aber ansonsten sollte die Liste aussehen und normal funktionieren, insbesondere in Bezug auf Artikelauswahl. Ich habe den folgenden Code, um dies zu erreichen. FXML wird aus Faulheit weggelassen, es ist nur ein <ListView />.JavaFX ListView CellFactory deaktiviert die Objektauswahl

// Controller for FXML 
public class MainController { 
    // Wrapper class containing several values 
    private class ListItem { 
     private String value; 

     public ListItem(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return value; 
     } 

     ... // Other useful stuff 
    } 

    @FXML private ListView<ListItem> list; 

    @FXML 
    public void initialize() { 
     // Set list to display using the given CellFactory 
     list.setCellFactory((list) -> { 
      return new ListCell<ListItem>() { 
       @Override 
       protected void updateItem(ListItem item, boolean empty) { 
        if (empty) return; 

        // Display item's value property 
        setText(item.getValue()); 
       } 
      }; 
     }); 

     // Add test data 
     list.getItems().add(new ListItem("test")); 
     list.getItems().add(new ListItem("test2")); 

     // Print when selection changes 
     list.getSelectionModel().selectedItemProperty().addListener((evt) -> { 
      System.out.println("Selection changed!"); 
     }); 
    } 
} 

Dies zeigt die ListItem richtig, in jedem Punkt des ListView seine value Eigenschaft. Es bricht jedoch die Auswahl, und die System.out.println(...) wird nicht ausgeführt (das Element auch nicht nicht Highlight in der GUI). Ich habe entdeckt, dass das Entfernen der list.setCellFactory(...) Aussage der Schuldige ist, aber bringt mich in eine schwierige Lage.

Wenn list.setCellFactory(...) vorhanden ist, verwendet das Element den richtig Text, aber nicht ausgewählt werden. Wenn list.setCellFactory(...) nicht vorhanden ist, verwendet das Element den falschen Text, aber kann ausgewählt werden. Gibt es noch etwas besonderes, das ich tun muss, um den Text korrekt anzuzeigen und den Artikel auswählen?

Ich habe die Voraussetzung Googeln gemacht, aber ich konnte niemand anderes mit diesem speziellen Problem finden. Jede Hilfe wird sehr geschätzt.

+0

Neben James_D Antwort es eine gute Idee ist, alle Änderungen rückgängig zu machen getan die Zelle, wenn ein Gegenstand entfernt wird. Andernfalls erhalten Sie Probleme wie diese: http://stackoverflow.com/q/38483552/2991525. Setzen Sie den 'text' für leere Zellen auf' null' oder '" '. – fabian

Antwort

3

Sie benötigen

super.updateItem(item, empty); 

als die erste Zeile von updateItem(...) hinzuzufügen. Dieser Aufruf muss immer in einer überschriebenen Cell.updateItem(...)-Methode vorhanden sein (das gleiche gilt für andere Methoden wie updateIndex(...)).

Darüber hinaus sollten Sie auch sicherstellen, dass Ihre updateItem(...) Methode alle Fälle korrekt behandelt, einschließlich dem Fall, in dem Zelle leer ist:

protected void updateItem(ListItem item, boolean empty) { 
    super.updateItem(item, empty); 
    if (empty) { 
     setText(null); 
    } else { 
     // Display item's value property 
     setText(item.getValue()); 
    } 
} 
+0

Perfekt. Das war genau das Problem. Ich bin vertrauter mit C# und dachte darüber nach wie ein Lambda, also kam es mir nicht in den Sinn, die Superklasse zu nennen. Danke für die Hilfe und den Hinweis zum "leeren" Fall. –

Verwandte Themen