Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème d'update de jComboBox

3 réponses
Avatar
yvon.thoravalNO-SPAM
j'ai un problème d'update de jComboBox et je tourne en rond depuis un
moment...

j'ai une jComboBox qui permet de changer le "language", ça ca marche
MAIS comme je change le "language" j'aimerais aussi que les items
changent accordingly...

mais ça boucle :))

disons qu'au départ j'ai ça :

index item
0 Allemand
1 Anglais
2 Français
3 Italien

avec getSelectedIndex() = 2
je choisi "Italien" (getSelectedIndex() = 3), le "laguage" bascule bien
sur "Italien" MAIS, dans la foulée, je cherche à faire un update de la
jComboBox de telle manière que j'aie :

index item
0 Tedesco
1 Inglese
2 Francese
3 Italiano

aussi je fais un removeAllItems() suivi de
insertItemAt(prefsMiscCombosItems.get(i).get(j), j)

et j'essaie de remettre l'index sélectionné à la valeur précédente :
setSelectedIndex(idx); (le idx vient d'un getsetSelectedIndex();
précédent la màj.

déjà là ca ne va pas parcque je me retrouve avec un index à -1

idx = combo.getSelectedIndex();// donne 2
je fais l'update (qui marche)
combo.setSelectedIndex(idx);
je relis immédiatement après :
idx = combo.getSelectedIndex();// donne -1

j'ai essayé de "ruser" en faisant :

idx = combo.getSelectedIndex();// donne 2
combo..setEnabled(false);//j'interdis une sélection pendant l'update
je fais l'update (qui marche)
combo..setEnabled(true);//j'autorise une sélection après l'update
combo.setSelectedIndex(idx);
je relis immédiatement après :
idx = combo.getSelectedIndex();// donne -1

donc même résultat....

--
yt

3 réponses

Avatar
jocelyn
Salut,

Je pense que ton pb vient du fait que tu passes tjrs par la vue pour jouer
sur les données de ta combo, ce qui balance des événements
dans tous les sens. Quand tu veux agir de manière globale, il vaut mieux
aller directement fouiner dans le modèle.

Je joins le code qui donne un debut de piste. Attention ! Je sais que ce
code est tres mal fait,
pas beau et meme vilain :) Il s'agit juste de donner une piste sur la
maniere de faire. D'autre part les
connaisseurs verront que j'utilise JBuilder...

public class TestFrame extends JFrame {
private JPanel contentPane;
private BorderLayout borderLayout1 = new BorderLayout();
private JComboBox combo = new JComboBox();

public TestFrame() {
try {
jbInit();
}
catch(Exception ex) {

}
}

private void jbInit() throws Exception {
String[] data = new String[4];
data[0] = "Anglais";
data[1] = "Allemand";
data[2] = "Francais";
data[3] = "Italien";

combo.setModel(new DefaultComboBoxModel(data));
combo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
combo_actionPerformed(e);
}
});
contentPane = (JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(246, 39));
this.setTitle("Projet de test");
contentPane.add(combo, BorderLayout.CENTER);
}

private void combo_actionPerformed(ActionEvent e) {
String s = (String)combo.getSelectedItem();
int idx = combo.getSelectedIndex();
if (s.equals("Italien")) {
String[] data = new String[4];
data[0] = "Inglese";
data[1] = "Tedesco";
data[2] = "Francese";
data[3] = "Italiano";
combo.setModel(new DefaultComboBoxModel(data));
combo.setSelectedIndex(idx);
}
}
}

--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même
Avatar
yvon.thoravalNO-SPAM
jocelyn wrote:

Je pense que ton pb vient du fait que tu passes tjrs par la vue pour jouer
sur les données de ta combo, ce qui balance des événements
dans tous les sens. Quand tu veux agir de manière globale, il vaut mieux
aller directement fouiner dans le modèle.

Je joins le code qui donne un debut de piste.


Oui, merci beaucoup, finalement je dois traiter mes JComboBox comme des
JTable... agir sur le modèle, c'est ça la clé :))

Je vais essayer demain matin ton code, il me faut l'adapter because mes
String[] proviennent d'un fichier *.properties...
--
yt

Avatar
yvon.thoravalNO-SPAM
jocelyn wrote:

il vaut mieux
aller directement fouiner dans le modèle.


merci encore j'ai implémenté suivant tes conseils, ça va beaucoup mieux
et le code est nettement plus simple :))

avant j'arrivait même à avoir un "bus error" après avoir bouclé une
soixantaine de fois...

maintenant je n'en plus que 4, à chque fois, mais là cela vient
peut-être de la souris, des rebonds que sais-je, en tout cas c'est
stable càd que ca ne change pas le langage, transitoirement, pendant le
changement de langage...

Le Model n'a pas suffit, pour calmer le jeu il a fallu que j'implémente
l'actionListener...
--
yt