IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JComboBox, personnalisation d'affichage.


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut JComboBox, personnalisation d'affichage.
    Bonjour à tous.

    Un petit problème me taraude depuis quelques jours, et je me décide enfin à poster. Le voici expliqué.
    J'ai un objet JComboBox. Je l'initialise avec le modèle qui va bien (qui me permet de gérer une liste de files de priorités, passons).

    Maintenant, j'aimerais bien ne pas afficher le produit (ignoble) de la méthode toString() de ces files, mais un truc du genre :
    File 1
    File 2
    ...

    Après quelque recherche, j'en suis arrivé a la conclusion qu'il fallait remplacer le renderer de mon JComboBox. Je me crée donc mon petit renderer perso comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private class ComboRenderer extends JLabel implements ListCellRenderer {
     
            public ComboRenderer() {
                super();
            }
     
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                setText("File n° " + index);
                return this;
            }
        }
    Deux problèmes se posent alors :
    1 - Lors du premier affichage, le JComboBox affiche "Liste -1", pas top.
    2 - Lorsque je sélectionne un autre item dans la liste, l'affichage ne se met pas à jour. (Alors la sélection s'est bien faite, je peux bien modifier le contenu de l'item sélectionné)

    Avec le renderer par défaut (rendu dégueu donc) le changement s'effectue bien et l'affichage initial est vide.

    Help please =D

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par Bowbaq Voir le message
    je peux bien modifier le contenu de l'item sélectionné
    L' editor est utilisé quand la combo box est editable. Voir JComboBox#setEditor(..).

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Bonjour !

    Je vais reformuler ma question, il semblerais qu'il y a confusion

    Mon problème n'est pas un problème de sélection a proprement parler. Lorsque je sélectionne un élément dans le menu déroulant, la structure de donnée correspondante dans mon model est bien sélectionnée. Je peux ensuite la modifier via mon interface.

    Peut être qu'une image sera plus parlante pour décrire mon problème :

    Avec le renderer par défaut :
    Lancement de l'application.

    Pendant la selection.

    Après la selection.



    Avec le renderer personnalisé :
    Lancement de l'application.

    Pendant la selection.

    Après la selection.



    Concrètement ce que je cherche a faire, c'est juste changer le nom des items affichés par le renderer par défaut (issu de la méthode toString des objets).
    Et apparemment, utiliser un renderer personnalisé serait la solution, sauf que le mien ne fonctionne pas comme prévu : l'élément selectionné ne s'affiche pas en tant que tel.

    Et j'aimerais bien comprendre pourquoi Merci de m'aider.

  4. #4
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Dans le cas du champ de texte, on ne dispose pas de l'indice parce que ce n'est pas une liste. Essaie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (index < 0) {
        setText("File n° " + jComboBox1.getSelectedIndex());
    } else {
        setText("File n° " + index);
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Parfait, après quelques petites modifications ça fait exactement ce que je veux.
    J'hérite DefaultListCellRenderer au lieu d'hériter JLabel et d'implémenter ListCellRenderer. Cela me permet d'appeler la méthode de la classe parente et de récupérer le surlignage bleu quand l'élément à le focus.
    Et j'ajoute une petite condition pour avoir un champ vide lorsque qu'aucun élément n'est encore sélectionné.

    Voici le code final pour référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     private class ComboRenderer extends DefaultListCellRenderer {
     
            public ComboRenderer() {
                super();
            }
     
            @Override
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            	super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            	if (index < 0) {
            		if (jcb.getSelectedIndex() == -1)
            			setText("");
            		else
            			setText("File n° " + jcb.getSelectedIndex());
            	} else {
            	    setText("File n° " + index);
            	}
                return this;
            }
        }
    Merci beaucoup pour votre aide.

  6. #6
    Invité de passage
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Par défaut
    Bonjour,

    Il aurait aussi été possible de faire de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    private class ComboRenderer implements ListCellRenderer {
     
            private javax.swing.JLabel label;
     
            public ComboRenderer() {
                label = new javax.swing.JLabel();
                label.setOpaque(true); // Important pour l'affichage de la couleur du background
            }
     
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                if (index < 0) {
                    if (list.getSelectedIndex() == -1) {
                        label.setText("");
                    } else {
                        label.setText("File n° " + list.getSelectedIndex());
                    }
                } else {
                    label.setText("File n° " + index);
                }
                if(isSelected) {
                    label.setBackground(list.getSelectionBackground());
                    label.setBackground(list.getSelectionForeground());
                } else {
                    label.setBackground(list.getBackground());
                    label.setBackground(list.getForeground());
                }
     
                return label;
            }
        }
    Simplement à but culturel étant donné que vous avez trouvé une solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JComboBox] Défilement et affichage automatique
    Par michaeljeru dans le forum Composants
    Réponses: 2
    Dernier message: 26/01/2008, 12h11
  2. MOSS2007 : Personnaliser l'affichage des Annonces
    Par Mirror69 dans le forum SharePoint
    Réponses: 3
    Dernier message: 27/08/2007, 15h09
  3. Réponses: 2
    Dernier message: 16/04/2007, 17h59
  4. Réponses: 2
    Dernier message: 04/12/2005, 13h26
  5. [Struts]personnaliser l'affichage avec des tags
    Par adrien.nicolet dans le forum Struts 1
    Réponses: 1
    Dernier message: 30/10/2005, 19h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo