Heim >Java >javaLernprogramm >Wie kann ich benutzerdefinierte Objekteigenschaften in einer JavaFX-ListView anzeigen?

Wie kann ich benutzerdefinierte Objekteigenschaften in einer JavaFX-ListView anzeigen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-25 00:25:02468Durchsuche

How Can I Display Custom Object Properties in a JavaFX ListView?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn