Améliorer sa visibilité

List box Java : exemples de code pour débutants et confirmés

List box Java : exemples de code pour débutants et confirmés

La list box Java est l'un des composants graphiques les plus utilisés dans le développement d'interfaces utilisateur avec Swing ou JavaFX. Elle permet à l'utilisateur de sélectionner un ou plusieurs éléments dans une liste affichée à l'écran — un besoin récurrent dans presque toutes les applications de bureau. Que vous débutiez en Java ou que vous cherchiez à affiner vos implémentations, maîtriser ce composant vous fera gagner un temps précieux. Oracle Corporation, qui maintient Java, documente ces composants de manière exhaustive, mais la documentation officielle reste parfois aride pour les non-initiés. Cet article vous guide pas à pas, avec des exemples concrets, des erreurs à éviter et des techniques avancées rarement expliquées clairement ailleurs.

Ce que fait concrètement une list box en Java

Une list box est un composant d'interface graphique qui affiche une liste d'éléments et autorise leur sélection. En Java, ce rôle est principalement tenu par la classe JList dans la bibliothèque Swing, ou par ListView dans JavaFX. Ces deux approches répondent à des contextes différents : Swing reste dominant dans les applications legacy d'entreprise, tandis que JavaFX s'impose pour les projets modernes nécessitant un rendu plus soigné.

La JList de Swing fonctionne selon un modèle MVC (Modèle-Vue-Contrôleur). Le composant visuel est séparé des données qu'il affiche, via un ListModel. Cette architecture, bien que plus complexe à appréhender au départ, offre une flexibilité réelle : modifier les données du modèle met à jour l'affichage automatiquement, sans intervention supplémentaire.

Concrètement, une JList peut opérer en trois modes de sélection. Le mode SINGLESELECTION n'autorise qu'un seul élément sélectionné à la fois. Le mode SINGLEINTERVALSELECTION permet une plage continue d'éléments. Le mode MULTIPLEINTERVAL_SELECTION, activé par défaut, laisse l'utilisateur sélectionner des éléments non contigus en maintenant la touche Ctrl. Ce détail change radicalement l'expérience utilisateur selon le contexte métier.

La liste doit presque toujours être placée dans un JScrollPane. Sans ce conteneur, les éléments qui dépassent la hauteur visible restent inaccessibles à l'utilisateur. C'est une erreur fréquente chez les débutants. La documentation Oracle (disponible sur docs.oracle.com) précise ce point, mais il est facile de le négliger quand on assemble son interface rapidement.

JavaFX propose une approche différente avec ListView<T>, un composant générique qui s'intègre naturellement dans le paradigme FXML et les bindings de propriétés. La séparation entre la logique et la vue y est encore plus marquée, ce qui facilite les tests unitaires. Pour des applications nouvelles, ce choix mérite d'être considéré sérieusement.

Premiers pas : créer une list box Java avec JList

Voici les étapes fondamentales pour construire une JList fonctionnelle dans une application Swing. Suivre cet ordre évite la plupart des erreurs de débutant :

  • Créer un tableau ou un DefaultListModel contenant les données à afficher
  • Instancier la JList en lui passant le modèle ou le tableau
  • Envelopper la JList dans un JScrollPane pour gérer le défilement
  • Ajouter le JScrollPane au conteneur principal de la fenêtre (JFrame ou JPanel)
  • Attacher un ListSelectionListener pour réagir aux sélections de l'utilisateur

Voici un exemple minimal mais complet. On crée une fenêtre affichant une liste de langages de programmation :

import javax.swing.*; est la première ligne nécessaire. On déclare ensuite un DefaultListModel<String>, auquel on ajoute les éléments avec la méthode addElement(). La JList reçoit ce modèle dans son constructeur. Le JScrollPane encapsule la liste, puis s'ajoute au JFrame via getContentPane().add().

L'écoute des sélections se fait avec addListSelectionListener(). À l'intérieur du listener, pensez à vérifier e.getValueIsAdjusting() : cette méthode retourne true pendant que l'utilisateur fait glisser sa sélection. Sans cette vérification, votre code de traitement se déclenche plusieurs fois pour une seule action, ce qui produit des comportements inattendus.

Pour récupérer la valeur sélectionnée, utilisez getSelectedValue() pour une sélection simple, ou getSelectedValuesList() pour récupérer toutes les valeurs sélectionnées sous forme de liste. Ces deux méthodes couvrent la grande majorité des cas d'usage rencontrés en pratique.

Un détail qui change tout : la taille visible de la liste se contrôle avec setVisibleRowCount(). Sans cette instruction, Java applique une valeur par défaut de 8 lignes visibles, ce qui ne correspond pas toujours à votre mise en page. Définir explicitement ce nombre vous évite des surprises lors du redimensionnement de la fenêtre.

Personnalisation avancée et rendus sur mesure

Une JList basique affiche du texte noir sur fond blanc. Pour les applications professionnelles, ce rendu est souvent insuffisant. Java propose le mécanisme des ListCellRenderer pour personnaliser entièrement l'affichage de chaque cellule.

L'interface ListCellRenderer<T> impose une seule méthode : getListCellRendererComponent(). Cette méthode reçoit la liste, la valeur de l'élément, son index, un booléen indiquant s'il est sélectionné, et un autre indiquant s'il a le focus. Elle doit retourner un composant Java — typiquement un JLabel ou un JPanel — qui sera affiché à la place du rendu par défaut.

Avec cette technique, vous pouvez afficher des icônes à côté du texte, colorer les lignes alternativement, ou même intégrer des cases à cocher dans chaque entrée de la liste. Les applications de gestion de fichiers utilisent souvent ce mécanisme pour afficher les types MIME avec leurs icônes associées. C'est une approche puissante, mais elle demande de comprendre le cycle de rendu de Swing pour éviter les problèmes de performance.

Côté JavaFX, la personnalisation passe par les Cell Factories. La méthode setCellFactory() accepte un Callback qui produit des cellules personnalisées. La logique est similaire au ListCellRenderer, mais l'API bénéficie des avantages de JavaFX : binding de propriétés, CSS pour le style, et animations natives. Un ListView JavaFX stylisé via CSS reste beaucoup plus maintenable qu'un renderer Swing complexe.

La gestion des données dynamiques mérite une attention particulière. Avec DefaultListModel, ajouter ou supprimer des éléments met à jour l'affichage immédiatement. Mais si vous chargez des données depuis une base de données ou une API, il vaut mieux effectuer ces opérations dans un SwingWorker pour ne pas bloquer le thread graphique. Un thread graphique bloqué se traduit par une interface figée, perçue comme un bug par l'utilisateur final.

Identifier et corriger les problèmes courants

Les problèmes rencontrés avec les list boxes Java suivent des schémas récurrents. Identifier leur origine rapidement fait gagner des heures de débogage.

Le premier problème fréquent : la liste n'affiche rien. La cause la plus commune est l'absence de JScrollPane, ou le fait d'avoir ajouté la JList directement au JFrame sans passer par un panneau intermédiaire. Vérifiez toujours la hiérarchie de vos conteneurs avec un outil comme Swing Explorer ou simplement en affichant la structure dans la console.

Deuxième problème récurrent : le listener se déclenche en boucle. Comme mentionné plus haut, ne pas vérifier getValueIsAdjusting() en est la cause directe. Ajoutez systématiquement cette condition en première ligne de votre listener. Ce réflexe s'acquiert rapidement et évite des comportements difficiles à reproduire en test.

Troisième difficulté : les modifications du modèle ne sont pas reflétées dans la vue. Cela arrive quand on modifie directement le tableau passé au constructeur de JList, sans passer par le ListModel. Java ne peut pas détecter les modifications d'un tableau natif. La solution : utiliser systématiquement un DefaultListModel et ses méthodes dédiées (addElement, removeElement, set).

Pour JavaFX, un problème similaire survient avec les ObservableList. Si vous remplacez entièrement la liste au lieu de modifier l'instance existante, les bindings se cassent. Préférez toujours list.setAll(nouvelleDonnées) plutôt que listView.setItems(FXCollections.observableArrayList(...)) dans une mise à jour en cours d'exécution.

Enfin, les problèmes de performance apparaissent quand une liste contient plusieurs milliers d'éléments. Dans ce cas, un renderer complexe recalculé pour chaque cellule visible ralentit le défilement. La solution consiste à utiliser des objets renderer réutilisables, ou à passer à une virtualisation des cellules, nativement supportée par ListView en JavaFX.

Aller plus loin avec les ressources de la communauté Java

Maîtriser les list boxes ouvre la porte à des composants plus complexes : les JTable, les JTree, et les JComboBox partagent des mécanismes similaires (modèles, renderers, listeners). Comprendre JList en profondeur, c'est comprendre la logique de toute l'interface Swing.

La documentation officielle Oracle reste la référence absolue. La section "How to Use Lists" du Java Tutorial couvre les cas d'usage les plus courants avec des exemples exécutables. Pour JavaFX, le guide officiel de JavaFX Scene Builder complète utilement la documentation API.

La communauté des développeurs Java est active sur Stack Overflow, où des milliers de questions sur JList et ListView ont déjà été posées et résolues. Avant de poster une nouvelle question, rechercher votre message d'erreur exact donne souvent une réponse en moins de deux minutes.

Pour progresser rapidement, rien ne remplace la pratique sur un projet concret. Construire un gestionnaire de tâches simple, un sélecteur de fichiers ou un panier d'achat minimaliste force à manipuler les modèles de données, les events et les renderers dans des conditions réelles. Les bugs rencontrés dans ce contexte s'impriment bien mieux que n'importe quel tutoriel lu passivement.

Java continue d'évoluer avec des releases régulières, et les APIs graphiques suivent ce mouvement. Vérifier la compatibilité de vos exemples avec votre version de JDK reste une précaution utile, notamment si vous travaillez sur des projets qui doivent tourner sur plusieurs environnements. Les annotations de dépréciation dans l'IDE signalent les méthodes à remplacer avant qu'elles ne disparaissent dans une prochaine version.

La rédaction

Ce site est animé par une équipe éditoriale passionnée par le numérique, qui publie régulièrement des articles d'information destinés à éclairer les lecteurs sur les évolutions du web et des technologies associées. À propos