Jcombobox et toString... [Résolu]

Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
- - Dernière réponse : 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 + "]";
}
}
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 138 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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 .
Commenter la réponse de CG85
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
0
Merci
Salut,

Ok.

Que contient ta variable "scans" ?
______________________________________
DarK Sidious
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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
}
Commenter la réponse de CG85
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
0
Merci
Salut,

Et quel est le code de ta méthode updateInterpolation ?
______________________________________
DarK Sidious
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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();
}
}
Commenter la réponse de CG85
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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);
}
Commenter la réponse de CG85
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
73
0
Merci
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
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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....
Commenter la réponse de CG85
Messages postés
30
Date d'inscription
vendredi 2 janvier 2004
Statut
Membre
Dernière intervention
10 février 2010
0
Merci
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 ^^
Commenter la réponse de CG85