OVH Cloud OVH Cloud

Problème JCombobox et renderer

7 réponses
Avatar
luc.dewavrin
Salut,

j'ai un probl=E8me avec une JCombobox et un CustomRenderer.
Lorsque la liste s'affiche le renderer m'affiche correctement le
r=E9sultat
mais quand je s=E9lectionne un item dans la liste c'est comme si le
renderer n''=E9tait pas utilis=E9.

En fait, dans ma combobox j'ajoute des beans du m=EAme type WLServer
avec la m=E9thode addItem(). Je veux qu'au lieu de m'afficher le
"contenu" du bean avec la m=E9thode toString(), la combo m'affiche ce
que retourne la m=E9thode toJListFormat()du bean

J'ai donc =E9crit le code suivant:

JComboBox wlsCombo =3D new JComboBox();
wlsCombo.addItem("localhost:7001");
wlsCombo.setEditable(true);
wlsCombo.setRenderer(new WLServerComboBoxRenderer());
wlsCombo.addItem(new WLServer("localhost",7001));

et
public class WLServerComboBoxRenderer extends JLabel implements
ListCellRenderer {

public WLServerComboBoxRenderer() {
setOpaque(true);
}


public Component getListCellRendererComponent(JList list,
Object o,
int index,
boolean isSelected,
boolean cellHasFocus) {
if ( o instanceof WLServer ) {
WLServer wlserver =3D (WLServer)o;
setText(wlserver.toJListFormat());
}
else {
setText(o.toString());
}
return this;
}
}


Lorsque la liste s'affiche la m=E9thode toJListFormat est bien appel=E9e
mais lorsque je s=E9lectionne un =E9lement, c'est la m=E9thode toString
qui est appel=E9e.
J'ai trac=E9 par des System.out et c'est bien le bout de code
setText(wlserver.toJListFormat()); qui est appel=E9 lorsque je
s=E9lectionne un item. Mais on dirait qu'apr=E8s un autre appel
r=E9=E9crase ce qui est affich=E9.

A noter que j'utilise JGoodies.

Des id=E9es ?

7 réponses

Avatar
damien guerin
ça serait bien que tu dises ce qui s'affiche réellement avant et
après la sélection aux 2 index...!
Le problème intervient si tu sélectionnes ton 1er item, ton 2eme, les
2 ??
Avatar
Kupee
wrote:
j'ai un problème avec une JCombobox et un CustomRenderer.
Lorsque la liste s'affiche le renderer m'affiche correctement le
résultat
mais quand je sélectionne un item dans la liste c'est comme si le
renderer n''était pas utilisé.

En fait, dans ma combobox j'ajoute des beans du même type WLServer
avec la méthode addItem(). Je veux qu'au lieu de m'afficher le
"contenu" du bean avec la méthode toString(), la combo m'affiche ce
que retourne la méthode toJListFormat()du bean

J'ai donc écrit le code suivant:

JComboBox wlsCombo = new JComboBox();
wlsCombo.addItem("localhost:7001");
wlsCombo.setEditable(true);
wlsCombo.setRenderer(new WLServerComboBoxRenderer());
wlsCombo.addItem(new WLServer("localhost",7001));

et
public class WLServerComboBoxRenderer extends JLabel implements
ListCellRenderer {

public WLServerComboBoxRenderer() {
setOpaque(true);
}


public Component getListCellRendererComponent(JList list,
Object o,
int index,
boolean isSelected,
boolean cellHasFocus) {
if ( o instanceof WLServer ) {
WLServer wlserver = (WLServer)o;
setText(wlserver.toJListFormat());
}
else {
setText(o.toString());
}
return this;
}
}


Lorsque la liste s'affiche la méthode toJListFormat est bien appelée
mais lorsque je sélectionne un élement, c'est la méthode toString
qui est appelée.
J'ai tracé par des System.out et c'est bien le bout de code
setText(wlserver.toJListFormat()); qui est appelé lorsque je
sélectionne un item. Mais on dirait qu'après un autre appel
réécrase ce qui est affiché.

A noter que j'utilise JGoodies.

Des idées ?


Euh peut etre que tu devrais aussi implémenter l'Editor de ton JComboBox

Avatar
luc.dewavrin
En fait je n'ai rempli qu'un seul item d'un bean WLServer (exemple
simplifié ici):
class WLServer {
private String hostname;
private int port;

public WLServer(){};

public WLServer(String hostname,int port) {
this.hostname=hostname;
this.port = port;
}
...//Getters...

public String toString() {
return String.valueOf(this.hashcode());
}

public String toJListFormat() {
return hostname+":"+String.valueOf(port);
}


}
Avant la sélection, je vois le résultat de la méthode toJistFormat()
sur le bean et après sélection je vois le résultat de la méthode
toString().
Avatar
damien guerin
Si tu mets des system.out.println tel que :
dans ton toString de WLServer : System.out.println("toString
WLServer");
dans ton toJListFormat de WLServer : System.out.println("toJListFormat
WLServer");
dans getListCellRendererComponent sous
setText(wlserver.toJListFormat()); : System.out.println("WLServer
objet");
dans getListCellRendererComponent sous setText(o.toString()); :
System.out.println("Non WLServer objet");

Qu'est ce qui s'affiche à l'exécution?
Avatar
luc.dewavrin
J'ai plusieurs séquences:
WLServer objet
toJListFormat WLServer

Lorsque je déroule la combo et que je déplace mon curseur dessus.
Je clique et voici ce qui apparaît:
toString WLServer
WLServer objet
toJListFormat WLServer
toString WLServer

Je ne comprends pas c'est bien un toString() qui est appelé et je ne
vois aucun " Non WLServer objet", le renderer est outrepassé

En fait j'ai aussi alimenté ma liste dès le départ et c'est pareil
l'item sélectionné est affiché avec toString(). Je l'impression que
pour l'item selectionné le renderer n'est pas utilisé.
Avatar
Kupee
wrote:
J'ai plusieurs séquences:
WLServer objet
toJListFormat WLServer

Lorsque je déroule la combo et que je déplace mon curseur dessus.
Je clique et voici ce qui apparaît:
toString WLServer
WLServer objet
toJListFormat WLServer
toString WLServer

Je ne comprends pas c'est bien un toString() qui est appelé et je ne
vois aucun " Non WLServer objet", le renderer est outrepassé

En fait j'ai aussi alimenté ma liste dès le départ et c'est pareil
l'item sélectionné est affiché avec toString(). Je l'impression que
pour l'item selectionné le renderer n'est pas utilisé.


Je sais pas si mon post était la solution mais l'as tu essayé ?
Lorsque tu edite un element de ta liste, il n'est pas visualisé avec le
ListCellRenderer mais avec le ComboBoxEditor voilà un petit exemple

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

public class Tutu extends JFrame {

public Tutu() throws HeadlessException {
JComboBox b = new JComboBox(new Object[]{"CACA","COCO"});
b.setEditable(true);
b.setRenderer(new MyRenderer());
b.setEditor(new MyEditor());
getContentPane().add(b);
pack();
}

public static void main(String[] args) {
new Tutu().setVisible(true);
}

class MyRenderer extends JLabel implements ListCellRenderer {
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean
cellHasFocus) {
setText(((String)value).toLowerCase());
return this;
}
}

class MyEditor extends JTextField implements ComboBoxEditor {
public Component getEditorComponent() {
return this;
}

public void setItem(Object anObject) {
setText(((String)anObject).toLowerCase());
}

public Object getItem() {
return getText().toLowerCase();
}
}
}

Je met des String en majuscule dans le combo et le renderer les rend en
minuscule. Si tu met pas l'Editor, tu les éditera en majuscule, si tu
met l'editor, tu les verra en minuscule aussi, voilà

Avatar
luc.dewavrin
Oui cela fonctionne avec ton exemple (j'avais mis la Combo en mode
éditable).

Un grand merci


Luc