Comment personnaliser JComboBox

Dans ce tutoriel nous allons découvrir comment créer un composant JComboBox dans Java Swing avec un look personnalisé, plutôt que son apparence par défaut.
 
 

Comment personnaliser JComboBox?

Généralement, il est possible de fournir une implémentation GUI personnalisée pour les composants basés sur Swing en fournissant le rendu et l’éditeur. Par exemple:

//Créer le comboBox
JComboBox comboBox = new JComboBox(items);
//Définir le rendu
comboBox.setRenderer(new MyComboBoxRenderer());
//Définir l'éditeur
comboBox.setEditor(new MyComboBoxEditor());

 
Exemple complet:
 

import javax.swing.*;
import java.awt.*;

public class MyComboBox extends JFrame 
{     
    public MyComboBox() 
    {
        //Appeler le constructeur de la classe mère JFrame
        super("Personnaliser JComboBox");
        setLayout(new FlowLayout());
        //Les éléments de comboBoxe
        String[] items = {"Java", "PHP", "Python", "C++"};
        //Créer le comboBox
        JComboBox comboBox = new JComboBox(items);
        //Définir le rendu
        comboBox.setRenderer(new MyComboBoxRenderer());
        //Définir l'éditeur
        comboBox.setEditor(new MyComboBoxEditor());
        //Changer la taille du comboBox
        comboBox.setPreferredSize(new Dimension(130, 25));
        //Rendre le comboBoxe modifiable
        comboBox.setEditable(true);
        //Ajouter le comboBox au frame
        add(comboBox); 
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 100);
        //Centrer sur l'écran
        setLocationRelativeTo(null);    
    }
     
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyComboBox().setVisible(true);
            }
        });
    }
}

La classe de rendu(MyComboBoxRenderer()) doit implémenter l’interface javax.swing.ListCellRenderer. Il est utilisé pour rendre l’interface graphique du composant dans son état normal. Par exemple, la classe suivante, MyComboBoxRenderer, implémente un rendu simple qui est un JLabel:

import javax.swing.*;
import java.awt.*;

public class MyComboBoxRenderer extends JLabel implements ListCellRenderer {
 
  public MyComboBoxRenderer() {
      setOpaque(true);
      setFont(new Font("Times New Roman", Font.BOLD | Font.ITALIC, 15));
      setBackground(Color.BLACK);
      setForeground(Color.WHITE);
  }

  @Override
  public Component getListCellRendererComponent(JList l, Object val, 
  int i, boolean isSelected, boolean cellHasFocus) {
      setText(val.toString());
      return this;
   }
}

 
 
Comme nous pouvons le voir, la classe de rendu doit remplacer la méthode getListCellRendererComponent() qui est définie par l’interface ListCellRenderer. La méthode doit renvoyer une sous-classe de la classe Component qui est rendue en tant qu’élément de liste dans le ComboBox. Dans l’exemple ci-dessus, il renvoie une instance de la classe JLabel, et les résultats dans une zone de liste déroulante ressemblent à ceci:


 
La classe éditeur(MyComboBoxEditor()) doit implémenter l’interface ComboBoxEditor ou hérite la classe BasicComboBoxEditor. Il est utilisé pour rendre l’interface graphique du composant à l’état d’édition. Par exemple, la classe suivante, MyComboBoxEditor, implémente un simple éditeur qui est un JPanel contenant un JLabel:

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxEditor;

public class MyComboBoxEditor extends BasicComboBoxEditor 
{
    private JLabel l = new JLabel();
    private JPanel p = new JPanel();
    private Object objSelected;
     
    public MyComboBoxEditor() 
    {     
        l.setOpaque(false);
        l.setFont(new Font("Times New Roman", Font.BOLD, 15));
        l.setForeground(Color.RED);
         
        p.setLayout(new FlowLayout(FlowLayout.LEFT, 6, 3));
        p.add(l);
        p.setBackground(Color.BLUE);
    }
     
    public Component getEditorComponent() {
        return this.p;
    }
     
    public Object getItem() {
        return "[" + this.objSelected.toString() + "]";
    }
     
    public void setItem(Object item) {
        this.objSelected = item;
        l.setText(item.toString());
    }
}

 
 
La classe éditeur hérite la classe BasicComboBoxEditor et redéfinit les trois méthodes suivantes:

  • getEditorComponent(): retourne un objet de sous-classe de la classe Component qui est utilisé pour rendre le composant en état d’édition. Dans l’exemple ci-dessus, l’éditeur est un JPanel.
  • setItem(Object): cette méthode est appelée chaque fois qu’un élément est sélectionné dans la liste déroulante. Il appartient à l’éditeur de restituer le composant en fonction de l’élément passé. Dans l’exemple ci-dessus, il montre une étiquette avec un fond bleu et une police en gras.
  • getItem(): renvoie l’élément sélectionné dans la liste déroulante. Cette méthode est appelée par la méthode getSelectedItem() de JComboBox.

Cette classe rend le ComboBox comme suit:


 
Partagez cet article

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *