Jcombobox et toString...

Résolu
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010 - 10 févr. 2010 à 11:13
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010 - 10 févr. 2010 à 16:21
Bonjour,

J'ai un gros problème avec l'utilisation d'un JCombobox utilisant une liste d'objets de type "scan" (cf. plus bas pour le squelette). Lors de l'exécution du programme, j'ai une liste d'item (37 dans mon cas) dont seuls les 2 premiers peuvent être sélectionnés. Si j'utilise non pas une liste d'objets "Scan" mais des chaines de caractères je peux alors sélectionner correctement n'importe quel item...

Quelqu'un aurait-il été confronté à ce problème ?

Voici la déclaration de mon JCombobox (réaliser avec VE) :
private JComboBox getProfilComboBox() {
if (profilComboBox == null) {
profilComboBox = new JComboBox();
profilComboBox.setPreferredSize(new Dimension(150, 22));
profilComboBox.setModel(new DefaultComboBoxModel(scans.toArray(new Scan[0])));
profilComboBox.setSelectedIndex(profilComboBox.getItemCount() / 2);
profilComboBox.setEditable(false);
profilComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
updateInterpolation(true);
}
});
}
return profilComboBox;
}


Le squelette de la classe Scan:
@SuppressWarnings("serial")
public class Scan extends TreeSet<Measure> implements Visitable, Comparable<Scan> {

// code....

@override
public String toString() {
String direction;
float start;

if (Float.isNaN(x)) {
direction = "X";
start = y;
} else if (Float.isNaN(y)) {
direction = "Y";
start = x;
} else {
direction = "?";
start = z;
}
return "Scan " + start + " [" + direction + "]";
}
}

12 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 16:02
Salut,

Je ne pense pas que ce soit un bug dans le DefaultComboBoxModel, mais plutôt une référence de tes éléments Scan que tu modifierai dans ton code métier qui provoquerai un problème dans le model du combobox, mais c'est qu'une piste... d'où le test avec des instances de Scan qui sont totalement découplés des instances de scans que tu utilises pour voir si le comportement du JComboBox est bon ou pas.
______________________________________
DarK Sidious
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 11:36
Salut,

Qu'est-ce que tu veux dire par "seuls les 2 premiers peuvent être sélectionnés" : qu'est-ce que ca fait dans les autres cas ? Une exception est levée ?

Si tu remplace ta fonction toString par une fonction bidon qui renvoie un texte aléatoire, ca fait le même problème ?
______________________________________
DarK Sidious
0
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 12:18
Salut,

Et bien dans le premier cas je peux seulement sélectionner le premier ou le second item de mon JCombobox. Pour les autres cas, aucun évènements/exceptions n'est levés et mon item reste à la valeur précédente. Je ne peux faire varier mes valeurs qu'entre les deux premiers items.

Supprimer toString() de scan (donc cela reviens à faire une chaine "aléatoire" par l'intermédiaire d'Object) ne change rien au problème. En revanche si j'utilise une chaine de caractère aléatoire dans l'addItem à la place des scans, j'obtiens une JCombobox fonctionnel... Or j'ai besoin d'utiliser mes scans en tant qu'items pour les traitements.

Une solution consisterait à utiliser ses libellés pour retrouver par la suite mes scans via une boucle, mais ce n'est pas du tout élégant et non Objet .
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 14:33
Salut,

Ok.

Que contient ta variable "scans" ?
______________________________________
DarK Sidious
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 14:55
Alors pour le membre scans :
ScanSet scans;


Et pour la déclaration de la classe ScanSet :
@SuppressWarnings("serial")
public class ScanSet extends TreeSet<Scan> implements Visitable {
//code
}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 15:10
Salut,

Et quel est le code de ta méthode updateInterpolation ?
______________________________________
DarK Sidious
0
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 15:15
Voici la méthode updateInterpolation :
private void updateInterpolation(boolean updateReference) {
Scan ref = (Scan) getProfilComboBox().getSelectedItem();
VisualisationVisitor visu;		

try {
if (updateReference) {
for (Scan scan : scans)
if (scan.toString().equals(ref.toString())) {
visu = new VisualisationVisitor();
scan.accept(visu);
datas.removeSeries(rs.getString("measuresCurveTitle"));
datas.addSeries(rs.getString("measuresCurveTitle"), visu.getDatas());
break;
}
}

InterpolationCurveVisitor interpolate = new InterpolationCurveVisitor(getSpacing());
interpolated = (ScanSet) scans.clone();
interpolated.accept(interpolate);
for (Scan scan : interpolated)
if (scan.toString().equals(ref.toString())) {
visu = new VisualisationVisitor();
scan.accept(visu);
datas.removeSeries(rs.getString("interCurveTitle"));
datas.addSeries(rs.getString("interCurveTitle"), visu.getDatas());
break;
}
} catch (DicomException ex) {
ex.printStackTrace();
}
}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 15:25
Salut,

ok, est-ce que dans ta méthode, le ref récupéré correspond à la valeur sélectionné dans le JComboBox ou uniquement à la première ou deuxième valeur de ton JComboBox ?

Quel est le code de la méthode accept de ta classe Scan ?
______________________________________
DarK Sidious
0
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 15:35
Oui, la variable ref correspond bien à l'un des deux éléments selectionnés. J'ai également constaté que l'évènement actionPerformed n'est générée que sur les deuxpremier éléments également. Outre le JCombobox, mon code metier est parfaitement opérationnel.

Le code de la méthode accept est simplement utilisée dans la mise en oeuvre du patron de conception Visitor :
public void accept(Visitor visitor) throws DicomException {
visitor.visit(this);
}
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
10 févr. 2010 à 15:48
Salut,

Ok, c'est vraiment bizarre comme bug.

Dans le actionPerformed, quand tu veux récupérer l'élément sélectionné, tu n'obtiens que le premier ou le deuxième donc ?

Par contre, à l'affichage de la liste du combo, tout tes éléments sont bien affichés ?

As tu essayé de faire cà avec une simple List<Scan> découplée totalement de ton code métier pour voir ?
______________________________________
DarK Sidious
0
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 15:57
Dans le actionPerformed, quand tu veux récupérer l'élément sélectionné, tu n'obtiens que le premier ou le deuxième donc ?

Tout a fait.
Par contre, à l'affichage de la liste du combo, tout tes éléments sont bien affichés ?

Oui, ils ont bien leurs propres libellés

Je vais faire le test avec le List<Scan>. J'ai aussi dans l'idée de développer mon propre ComboBoxModel....
0
CG85 Messages postés 30 Date d'inscription vendredi 2 janvier 2004 Statut Membre Dernière intervention 10 février 2010
10 févr. 2010 à 16:21
Salut,

J'ai développé une nouvelle dialogbox ou j'insère des "Scan" à la volée dans un JCombobox, du genre :
for(int i = 0; i < 10; i++) {
Scan scan = new Scan();
scan.setY(i);
for(int j = 0; j < 10; j++)
scan.add(new Measure(i, j));
jComboBox.addItem(scan);
}


Dans ce cas, ca fonctionne.

Maintenant, en utilisant un code très poche de ce que j'ai dans mon application :
ScanSet scans = new ScanSet();
for(int i = 0; i < 10; i++) {
Scan scan = new Scan();
scan.setY(i);
for(int j = 0; j < 10; j++)
scan.add(new Measure(i, j));
scans.add(scan);
}
jComboBox.setModel(new DefaultComboBoxModel(scans.toArray(new Scan[0])));

Fonctionne également.

Donc je pense que tu as raison, il doit y avoir une modification de la structure ScanSet à un moment donnée dans mon code métier. Je vais verifier tout ça ^^
0