Maison >Java >javaDidacticiel >Comment puis-je afficher les propriétés d'un objet personnalisé dans un ListView JavaFX ?

Comment puis-je afficher les propriétés d'un objet personnalisé dans un ListView JavaFX ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 00:25:02462parcourir

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

Comment remplir un ListView dans JavaFX à l'aide d'objets personnalisés

Le défi réside dans le remplissage d'un ListView avec des objets personnalisés au lieu de chaînes. En utilisant une observableArrayList d'objets Word, où chaque mot a une chaîne de mots et une définition, nous voulons que ListView affiche la chaîne de mots au lieu de l'objet Word entier.

Solution personnalisée

Une approche consiste à utiliser une fabrique de cellules pour récupérer la chaîne de mots de l'objet Word pour chaque cellule. Voici l'extrait de code mis à jour :

<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>

Implémentations optimisées

1. Évitez de remplacer toString pour la présentation de l'interface utilisateur

Plutôt que de remplacer toString pour la présentation de l'interface utilisateur, envisagez d'utiliser une fabrique de cellules pour extraire les données appropriées pour la représentation de l'interface utilisateur. Cela maintient la logique de présentation de l'interface utilisateur séparée de la représentation textuelle de l'objet.

2. Personnalisation des cellules à l'aide de nœuds graphiques

Les usines de cellules permettent une personnalisation plus flexible, notamment l'ajout de nœuds graphiques aux cellules. Voici un exemple :

<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. Objets immuables et propriétés observables

Pour éviter les modifications involontaires d'objets, il est recommandé d'utiliser des objets Word immuables ou des objets avec des propriétés observables pour les mises à jour des champs. Cela permet à l'interface utilisateur de répondre aux modifications de propriété.

4. Mises à jour dynamiques

Les modifications apportées aux éléments de liste observables sous-jacents (par exemple, l'ajout, la suppression) déclencheront automatiquement des mises à jour dans la vue. Pour répondre aux modifications de propriétés au sein des objets, vous devrez implémenter une logique d'écoute dans la fabrique de cellules ou utiliser un extracteur. Un extracteur permet de notifier les modifications apportées aux propriétés observables.

Exemple avec Extracteur

<code class="java">ObservableList<Word> wordsList = FXCollections.observableArrayList(word ->
        new Observable[] {
                word.wordProperty(),
                word.definitionProperty()
        }
);</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn