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 :

[SWING][JLIST] Problème d'implémentation d'un ListCellRenderer


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut [SWING][JLIST] Problème d'implémentation d'un ListCellRenderer
    Bonsoir à tous,

    Je souhaitais afficher des informations dans une JList en setEnabled(false). Cela dit la couleur que prenait le texte ne le rendait pas très lisible. J'ai donc décidé d'implémenter un ListCellRenderer:

    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
            ListCellRenderer lcr = new ListCellRenderer()
            {
                public java.awt.Component getListCellRendererComponent (JList list,
                                                                        Object value, 
                                                                        int index,
                                                                        boolean isSelected,
                                                                        boolean cellHasFocus) 
                {
                    JLabel label = new JLabel();
                    label.setHorizontalAlignment(SwingConstants.RIGHT);
                    label.setText(value.toString());
     
                    return label;
                } 
            };
    Jusque là pas de problème, mon objectif était simplement d'avoir le texte à droite et surtout écris en noir, comme en setEnabled(true). Je n'ai plus qu'à mettre mon ListCellRenderer dans ma JList:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      maList.setCellRenderer(lcr);
    Seulement voilà, cette JList est à côté d'une autre JList qui elle n'est pas en setEnabled(false). Et je me suis aperçu que les espaces entre les item des deux JList étaient différents, ce qui avec une dizaine d'élements crée un décallage assez flagrant. Je dirais que les espaces dans la JList étant en setEnabled(true) sont de un ou deux pixel plus grand que celle qui utilise mon ListCellRenderer...

    Si quelqu'un avait une idée sur la variable à modifier pour avoir le même espace entre les item ça m'interesserait beaucoup !

    Merci d'avance...

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Essaie avec :

    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
            ListCellRenderer lcr = new DefaultListCellRenderer()
            {
                public java.awt.Component getListCellRendererComponent (JList list,
                                                                        Object value, 
                                                                        int index,
                                                                        boolean isSelected,
                                                                        boolean cellHasFocus) 
                {
                    super.getListCellRendererComponent (list, value, index, isSelected, cellHasFocus) 
                    setHorizontalAlignment(SwingConstants.RIGHT);
                    setText(value.toString());
                    setEnabled(false);
                    return this;
                } 
            };
    Puis fait quelques tests pour voir si tu ne peux pas virer quelques appels inutiles parmis les 3 setters.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut
    Merci Bouye, le problème d'alignement est résolu mais je n'arrive pas à changer la couleur du texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    setForeground(java.awt.Color.BLACK);
    setHorizontalAlignment(SwingConstants.RIGHT);
    setText(value.toString());
     
    return this;
    J'ai viré le setOpaque et ai rajouter un setForeground afin d'avoir le même rendu que si la JList n'était pas en setEnabled(false). Le premier setter marche mais le second veut pas prendre.

    Bizarre...

    --------------------------------------------------------------------------

    Bon j'ai finalement trouvé ce que je cherchais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                public java.awt.Component getListCellRendererComponent(JList list,
                                                                       Object value, 
                                                                       int index,
                                                                       boolean isSelected,
                                                                       boolean cellHasFocus) 
                {
                    super.getListCellRendererComponent(jList2, value, index, false, false);
                    setHorizontalAlignment(SwingConstants.RIGHT);
                    setText(value.toString());
     
                    return this;
                }
    J'appel getListCellRendererComponent en lui passant en paramètre la JList qui n'est pas en setEnabled(false). Les booléens isSelected et cellHasFocus sont toujours a false puisque ma JList est en setEnabled(false).

    La seule chose que je ne comprends pas c'est comment l'appel d'un getteur influe sur la valeur de retour. Peut être que tu pourrais éclairer ma lenterne stp

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Ce n'est pas un getter c'est une factory (qui est specifiee dans l'interface ListCellRenderer). Et pour etre precis le DefaultListCellRenderer est implemente par un unique JLabel qui s'autoconfigure via cet appel (d'ou le return this;) a chaque fois que la JList l'appelle (pour chaque ligne). C'est donc le meme JLabel qui est reutilise pour chaque ligne, dans le principe ca marche comme un tampon-encreur. L'appel a la super-methode permet d'avoir la configuration de base correcte pour le LnF de la JList.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 12
    Par défaut
    Ok merci beaucoup

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/03/2007, 15h32
  2. [JList] Problème d'affichage
    Par jena dans le forum Composants
    Réponses: 6
    Dernier message: 01/09/2005, 15h44
  3. Réponses: 12
    Dernier message: 01/07/2004, 11h03
  4. [JList] problème avec 2 listeners
    Par papy_tergnier dans le forum Composants
    Réponses: 2
    Dernier message: 21/06/2004, 10h05
  5. [swing][JComboBox]Problème de taille
    Par n!co dans le forum Composants
    Réponses: 8
    Dernier message: 06/03/2004, 10h53

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