Heim >Java >javaLernprogramm >Wie kann ich benutzerdefinierte Objekteigenschaften in einer JavaFX-ListView anzeigen?
So füllen Sie eine ListView in JavaFX mit benutzerdefinierten Objekten
Die Herausforderung besteht darin, eine ListView mit benutzerdefinierten Objekten anstelle von Zeichenfolgen zu füllen. Unter Verwendung einer observableArrayList von Word-Objekten, in der jedes Wort einen WordString und eine Definition hat, möchten wir, dass die ListView den WordString anstelle des gesamten Word-Objekts anzeigt.
Benutzerdefinierte Lösung
Ein Ansatz besteht darin, eine Zellfabrik zu verwenden, um für jede Zelle den WordString aus dem Word-Objekt abzurufen. Hier ist das aktualisierte Code-Snippet:
<code class="java">listViewOfWords.setCellFactory(param -> new ListCell<Word>() { @Override protected void updateItem(Word item, boolean empty) { super.updateItem(item, empty); if (empty || item == null || item.getWord() == null) { setText(null); } else { setText(item.getWord()); } } });</code>
Optimierte Implementierungen
1. Vermeiden Sie das Überschreiben von toString für die UI-Präsentation
Anstatt toString für die UI-Präsentation zu überschreiben, sollten Sie die Verwendung einer Zellfabrik in Betracht ziehen, um die entsprechenden Daten für die UI-Darstellung zu extrahieren. Dadurch bleibt die UI-Präsentationslogik von der Textdarstellung des Objekts getrennt.
2. Anpassung von Zellen mithilfe von Grafikknoten
Zellenfabriken ermöglichen eine flexiblere Anpassung, einschließlich des Hinzufügens von Grafikknoten zu Zellen. Hier ein Beispiel:
<code class="java">public static class WordListCell extends ListCell<Word> { private final Label title = new Label(); private final Label detail = new Label(); private final VBox layout = new VBox(title, detail); public WordListCell() { super(); title.setStyle("-fx-font-size: 20px;"); } @Override protected void updateItem(Word item, boolean empty) { super.updateItem(item, empty); setText(null); if (empty || item == null || item.getWord() == null) { title.setText(null); detail.setText(null); setGraphic(null); } else { title.setText(item.getWord()); detail.setText( item.getDefinition() != null ? item.getDefinition() : "Undefined" ); setGraphic(layout); } } }</code>
3. Unveränderliche Objekte und beobachtbare Eigenschaften
Um unbeabsichtigte Objektänderungen zu verhindern, wird empfohlen, unveränderliche Word-Objekte oder Objekte mit beobachtbaren Eigenschaften für Feldaktualisierungen zu verwenden. Dadurch kann die Benutzeroberfläche auf Eigenschaftsänderungen reagieren.
4. Dynamische Updates
Änderungen an den zugrunde liegenden beobachtbaren Listenelementen (z. B. Hinzufügen, Entfernen) lösen automatisch Aktualisierungen in der Ansicht aus. Um auf Eigenschaftsänderungen innerhalb von Objekten zu reagieren, müssen Sie Listener-Logik in der Zellfabrik implementieren oder einen Extraktor verwenden. Ein Extraktor hilft dabei, Änderungen an beobachtbaren Eigenschaften zu melden.
Beispiel mit Extraktor
<code class="java">ObservableList<Word> wordsList = FXCollections.observableArrayList(word -> new Observable[] { word.wordProperty(), word.definitionProperty() } );</code>
Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Objekteigenschaften in einer JavaFX-ListView anzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!