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

AWT/Swing Java Discussion :

[SWING] JComboBox contenant des JLabel ou JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut [SWING] JComboBox contenant des JLabel ou JPanel
    Bonjour,

    Dans mon appli, je voudrais laisser la possibilité à l'utilisateur de choisir l'apparence des formes qu'il peut dessiner. Pour cela, j'ai créé une boîte de dialogue où il peut choisir la couleur du contour, de l'arrière-plan, l'épaisseur du trait et le type de trait (trait plein, pointillés, axe).

    Pour cette dernière option, je voulais utiliser le même principe que Word, c'est-à-dire une JComboBox dans laquelle je représente le type de trait.
    Et je ne sais pas trop comment faire.

    Je pensais ajouter dans la JComboBox des éléments de type JLabel ou JPanel pour lesquels j'aurais redéfini la méthode paint(Graphics g) afin qu'elle trace la représentation adéquate.
    J'ai donc créé 3 classes quasiment identiques où seule la méthode paint() diverge. Voici l'une d'elle :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    	class AxisStrokePanel extends JPanel {
     
    		public AxisStrokePanel() {
    			super();
    			setSize(40,20);
    		}
     
    		public AxisStrokePanel(boolean arg0) {
    			super(arg0);
    			setSize(40,20);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    			setSize(40,20);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0) {
    			super(arg0);
    			setSize(40,20);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un trait plein).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
    			g2d.setBackground(Color.WHITE);
    			g2d.setColor(Color.BLACK);
     
    			g2d.drawLine(0, 10, 15, 10);
    			g2d.drawLine(20, 10, 25, 10);
    			g2d.drawLine(30, 10, 45, 10);
    			g2d.drawLine(50, 10, 55, 10);
    		}
    	}
    Or il se trouve que lorsque j'ajoute ces éléments à ma JComboBox, celle-ci m'affiche juste le nom de la classe. Ceci correspond à ce qui est dit dans la Javadoc, puisque le Renderer de la JComboBox applique la méthode toString() à l'item sélectionné.

    Il semblerait donc qu'il faille redéfinir le Renderer, mais je n'arrive pas à le faire.
    Quelqu'un saurait-il comment je dois m'y prendre?

    Merci d'avance!

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Pour définir un tel comportement, il faut en effet passer par un Renderer.

    Par exemple :
    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
    class MyCellRenderer implements ListCellRenderer {
     
         AxisStrokePanel[] mesComps;
     
         public MyCellRenderer() {
            //initialiser ton tableau de composants
        }
     
         public Component getListCellRendererComponent(
             JList list,
             Object value,
             int index,
             boolean isSelected,
             boolean cellHasFocus)
         {
             Component comp = mesComps[index]; //edit : petite erreur
             comp.setBackground(isSelected ? Color.blue : Color.white);
             return comp;
         }
     }
    Il ne te manque plus qu'à spécifier ce renderer pour ta JComboBox.
    Remarque : dans ta méthode paint(), je ferais plutot un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void paint(Graphics g) {
             g.setColor(getBackground());
             g.fillRect(0, 0, getWidth(), getHeight());
             g.setColor(Color.BLACK);         
             g.drawLine(0, 10, 15, 10);
             g.drawLine(20, 10, 25, 10);
             g.drawLine(30, 10, 45, 10);
             g.drawLine(50, 10, 55, 10);
    }
    [EDIT] dans la méthode getListCellRendererComponent, il faut peut etre remplacer isSelected par hasFocus. A tester pour etre sur.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ok!
    L'idée était bonne, mais j'ai rencontré un petit problème avec le valeur de index, donc j'ai légèrement adapté...

    J'ai toujours un léger problème, mais voici déjà le code que j'ai utilisé pour faire tout ça :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    	class ComboBoxRenderer extends JLabel implements ListCellRenderer {
     
     
    		public ComboBoxRenderer() {
    			setOpaque(true);
    			setHorizontalAlignment(CENTER);
    			setVerticalAlignment(CENTER);
     
    		}
     
    		/*
    		 * This method finds the image and text corresponding to the selected
    		 * value and returns the label, set up to display the text and image.
    		 */
    		public Component getListCellRendererComponent(JList list, Object value,
    				int index, boolean isSelected, boolean cellHasFocus) {
    			//TODO : à voir...
    			// Get the selected index. (The index param isn't
    			// always valid, so just use the value.)
    //			int selectedIndex = ((Integer) value).intValue();
     
    			list.setForeground(Color.BLACK);
    			list.setBackground(Color.WHITE);
    			list.setSelectionForeground(Color.WHITE);
     
    			if (isSelected) {
    				setBackground(list.getSelectionBackground());
    				setForeground(list.getSelectionForeground());
    			} 
    			else {
    				setBackground(list.getBackground());
    				setForeground(list.getForeground());
    			}
     
    			ComboBoxPanel selectedPanel = (ComboBoxPanel) value;
     
    			return selectedPanel;
    		}
    	}
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class FullStrokePanel extends ComboBoxPanel {
     
    		public FullStrokePanel() {
    			super();
    		}
     
    		public FullStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public FullStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public FullStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un trait plein).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 60, 8);
    		}
    	}
     
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class DottedStrokePanel extends ComboBoxPanel {
     
    		public DottedStrokePanel() {
    			super();
    		}
     
    		public DottedStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public DottedStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public DottedStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un trait en pointillés).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 10, 8);
    			g2d.drawLine(20, 8, 30, 8);
    			g2d.drawLine(40, 8, 50, 8);
    		}
    	}
     
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class AxisStrokePanel extends ComboBoxPanel {
     
    		public AxisStrokePanel() {
    			super();
    		}
     
    		public AxisStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un axe).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 15, 8);
    			g2d.drawLine(20, 8, 25, 8);
    			g2d.drawLine(30, 8, 45, 8);
    			g2d.drawLine(50, 8, 55, 8);
    		}
    	}
     
     
     
     
     
    	abstract class ComboBoxPanel extends JPanel {
    		boolean isSelected = false;
     
     
    		public ComboBoxPanel() {
    			super();
    			init();
    		}
     
    		public ComboBoxPanel(boolean arg0) {
    			super(arg0);
    			init();
    		}
     
    		public ComboBoxPanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    			init();
    		}
     
    		public ComboBoxPanel(LayoutManager arg0) {
    			super(arg0);
    			init();
    		}
     
     
     
     
    		private void init() {
    			setSize(60,35);
    			setBackground(Color.WHITE);
    		}
     
    		public void paint(Graphics g) {
    			super.paint(g);
    		    g.setColor(getBackground());
    		    g.fillRect(0, 0, getWidth(), getHeight()); 
    		    g.setColor(getForeground());
     
    			Graphics2D g2d = (Graphics2D) g;
    			g2d.setStroke(new BasicStroke(1.5f));
    		}
     
    		public boolean isSelected() {
    			return isSelected;
    		}
     
    		public void setSelected(boolean isSelected) {
    			this.isSelected = isSelected;
    		}
    	}
    Tout fonctionne à merveille, j'ai juste un petit problème esthétique...

    En fait quand je clique sur ma JComboBox, elle se déroule et me montre tous les choix possibles.
    Le problème, c'est que la liste affichée est trop petite : les "cases" qu'elle contient ne sont pas assez "hautes" pour moi. Ce qui me choque le plus, c'est que la dernière case a son motif dessiné juste au-dessus de la fin de la liste...

    Est-ce quelqu'un sait comment je peux paramètrer la hauteur des cases de ma JComboBox?

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    C'est bon!
    J'avais oublié d'affecter la preferredSize... Je suis trop bête

    Voilà le code pour ceux que ça intéresse :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    	class ComboBoxRenderer extends JPanel implements ListCellRenderer {
     
     
    		public ComboBoxRenderer() {
    			setOpaque(true);
    			setSize(new Dimension(60,35));
    			setPreferredSize(new Dimension(60,35));
    			setMaximumSize(new Dimension(60,35));
    			setMinimumSize(new Dimension(60,35));
    		}
     
    		/*
    		 * This method finds the image and text corresponding to the selected
    		 * value and returns the label, set up to display the text and image.
    		 */
    		public Component getListCellRendererComponent(JList list, Object value,
    				int index, boolean isSelected, boolean cellHasFocus) {
    			//TODO : à voir...
    			// Get the selected index. (The index param isn't
    			// always valid, so just use the value.)
    //			int selectedIndex = ((Integer) value).intValue();
     
    			list.setForeground(Color.BLACK);
    			list.setBackground(Color.WHITE);
    			list.setSelectionForeground(Color.WHITE);
     
    			if (isSelected) {
    				setBackground(list.getSelectionBackground());
    				setForeground(list.getSelectionForeground());
    			} 
    			else {
    				setBackground(list.getBackground());
    				setForeground(list.getForeground());
    			}
     
    			ComboBoxPanel selectedPanel = (ComboBoxPanel) value;
     
    			return selectedPanel;
    		}
    	}
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class FullStrokePanel extends ComboBoxPanel {
     
    		public FullStrokePanel() {
    			super();
    		}
     
    		public FullStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public FullStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public FullStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un trait plein).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 60, 8);
    		}
    	}
     
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class DottedStrokePanel extends ComboBoxPanel {
     
    		public DottedStrokePanel() {
    			super();
    		}
     
    		public DottedStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public DottedStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public DottedStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un trait en pointillés).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 10, 8);
    			g2d.drawLine(20, 8, 30, 8);
    			g2d.drawLine(40, 8, 50, 8);
    		}
    	}
     
     
     
     
     
    	/**
             * Classe représentant un panel à l'intérieur duquel sera dessiné 
             * un trait plein. (utilisé pour remplir la comboStyle)
             * 
             * @author st11870
             */
    	class AxisStrokePanel extends ComboBoxPanel {
     
    		public AxisStrokePanel() {
    			super();
    		}
     
    		public AxisStrokePanel(boolean arg0) {
    			super(arg0);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    		}
     
    		public AxisStrokePanel(LayoutManager arg0) {
    			super(arg0);
    		}
     
     
    		/**
                     * Méthode de dessin.
                     * Remplit le panel avec la couleur grise et trace la représentation
                     * du style de trait correspondant au panel (ici un axe).
                     */
    		public void paint(Graphics g) {
    			super.paint(g);
     
    			Graphics2D g2d = (Graphics2D) g;
     
    			g2d.drawLine(0, 8, 15, 8);
    			g2d.drawLine(20, 8, 25, 8);
    			g2d.drawLine(30, 8, 45, 8);
    			g2d.drawLine(50, 8, 55, 8);
    		}
    	}
     
     
     
     
     
    	abstract class ComboBoxPanel extends JPanel {
     
     
    		public ComboBoxPanel() {
    			super();
    			init();
    		}
     
    		public ComboBoxPanel(boolean arg0) {
    			super(arg0);
    			init();
    		}
     
    		public ComboBoxPanel(LayoutManager arg0, boolean arg1) {
    			super(arg0, arg1);
    			init();
    		}
     
    		public ComboBoxPanel(LayoutManager arg0) {
    			super(arg0);
    			init();
    		}
     
     
     
     
    		private void init() {
    			setSize(new Dimension(60,35));
    			setPreferredSize(new Dimension(60,15));
    			setMaximumSize(new Dimension(60,15));
    			setMinimumSize(new Dimension(60,15));
    			setBackground(Color.WHITE);
    		}
     
    		public void paint(Graphics g) {
    			super.paint(g);
    		    g.setColor(getBackground());
    		    g.fillRect(0, 0, getWidth(), getHeight()); 
    		    g.setColor(getForeground());
     
    			Graphics2D g2d = (Graphics2D) g;
    			g2d.setStroke(new BasicStroke(1.5f));
    		}
    	}
    Merci pour tout!

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Finalement, mon problème n'est pas tout à fait résolu...
    Voilà ce que je voudrai : lorsque je déroule ma JComboBox, et que je me ballade sur les items qu'elle contient, je souhaiterai que l'élément sur lequel se situe la souris soit mis en surbrillance.

    Etant donné que j'ai redéfini le Renderer et que j'utilise des Panels dont j'ai défini moi-même la méthode paint(), je pense que mon problème vient de là. Mais je ne sais pas comment le résoudre.

    Une idée?

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Note : surcharge paintComponent(), pas paint()

    Pour la surbrillance, tu as essaye de faire ca en fonction du parametre hasFocus ?
    Romain Guy
    Android - Mon livre - Mon blog

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Citation Envoyé par Gfx
    Note : surcharge paintComponent(), pas paint()

    Pour la surbrillance, tu as essaye de faire ca en fonction du parametre hasFocus ?
    1) Quelle est la différence entre paintComponent() et paint()?

    2) Pour l'utilisation de hasFocus, j'ai essayé de faire ça :
    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
     
    		public Component getListCellRendererComponent(JList list, Object value,
    				int index, boolean isSelected, boolean cellHasFocus) {
     
    			list.setForeground(Color.BLACK);
    			list.setBackground(Color.WHITE);
    			list.setSelectionForeground(Color.WHITE);
     
    			if (isSelected) {
    				setBackground(list.getSelectionBackground());
    				setForeground(list.getSelectionForeground());
    			} 
    			else {
    				setBackground(list.getBackground());
    				setForeground(list.getForeground());
    			}
     
    			ComboBoxPanel selectedPanel = (ComboBoxPanel) value;
     
    			if (cellHasFocus) {
    				selectedPanel.setBackground(list.getSelectionBackground());
    				selectedPanel.setForeground(list.getSelectionForeground());
    			} 
    			else {
    				selectedPanel.setBackground(list.getBackground());
    				selectedPanel.setForeground(list.getForeground());
    			}
     
    			return selectedPanel;
    		}
    mais ça ne donne rien...
    Une petite piste?

  8. #8
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    paint() fait par defaut des trucs en interne que tu court-circuite en le surchargeant. La methode paint() de JComponent gere par exemple le clipping, etc. En la remplacant tu perds des optimisations et des actions sur lesquelles d'autres composants peuvent compter.
    Romain Guy
    Android - Mon livre - Mon blog

  9. #9
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ok!
    En fait, le champ hasFocus est toujours à false. Par contre, le champ isSelected passe à true quand le curseur passe sur la case.
    Je pensais que isSelected était à true seulement si la case était la case sélectionnée (autrement celle choisie par l'utilisateur lors du précédent clic), mais en fait pas du tout...

    Donc voici le code :
    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
     
    		public Component getListCellRendererComponent(JList list, Object value,
    				int index, boolean isSelected, boolean cellHasFocus) {
     
    			list.setForeground(Color.BLACK);
    			list.setBackground(Color.WHITE);
    			list.setSelectionForeground(Color.WHITE);
     
    			ComboBoxPanel selectedPanel = (ComboBoxPanel) value;
     
    			if (isSelected) {
    				setBackground(list.getSelectionBackground());
    				setForeground(list.getSelectionForeground());
     
    				selectedPanel.setBackground(list.getSelectionBackground());
    				selectedPanel.setForeground(list.getSelectionForeground());
    			} 
    			else {
    				setBackground(list.getBackground());
    				setForeground(list.getForeground());
     
    				selectedPanel.setBackground(list.getBackground());
    				selectedPanel.setForeground(list.getForeground());
    			}
     
    			return selectedPanel;
    		}
    	}

  10. #10
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    J'allais justement faire la remarque. J'ai lu le code du DefaultListCellRenderer utilise par BasicComboBoxUI et il utilise bien isSelected. hasFocus devrait valoir true quand tu donnes le focus a ta combo box puis que tu navigues au clavier (fleches haut/bas par exemple).
    Romain Guy
    Android - Mon livre - Mon blog

  11. #11
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Points : 722
    Points
    722
    Par défaut
    Ok!
    Merci pour toutes ces infos : ça marche du feu de Dieu!

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

Discussions similaires

  1. Positionner des jlabel dans un jpanel
    Par sarra02 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 02/06/2015, 16h55
  2. Problème de refresh sur un Jtree contenant des JPanel
    Par abroski dans le forum Composants
    Réponses: 0
    Dernier message: 23/03/2010, 09h09
  3. JTable contenant des JComboBox contenant des Images
    Par lex13 dans le forum Composants
    Réponses: 4
    Dernier message: 31/07/2007, 15h57
  4. JPanel sur JPanel contenant des JButton
    Par loic_86 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 17/05/2006, 20h49
  5. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49

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