j'ai un ComboBox qui tire ses valeurs d'un tableau de String.
Ces valeurs peuvent être modifiées par l'utilisateur.
Le problème c'est que je ne sais pas comment faire pour mettre à jour
(redessiner) ce ComboBox un fois que une ou plusieurs de ses valeurs ont été
modifiées.
Est-ce que quelqu'un pourrait m'aider en me donnant une solution à ce
problème ?
j'ai déjà posé la question, on m'a dit d'utiliser un
DefaultComboBoxModel...mais encore ?
combobox = new JComboBox();
for(int i = 0; i < string.length; i++){
combobox.add(string[i]);
}
add(combobox);
validate();
Bien sûr, si qqn a mieux, je suis également à la recherche de solutions plus
"élégantes"...
Richard
si quelqu'un a une autre solution, ça me serait utile :)
merci !
voilà une idée :
disons que ton tab est de la forme
String tab[] = {"riri", "fifi", "loulou"}
disons que ta combo est de la forme
Combo conb = new Combo()
comme elle est déjà pleinne, tu peut soit ajouter des éléments addItem()
addItemAt() soit en supprimer removeItem() removeItemAt() soit vider
complétement la combo removeAllItem()
si tu choisi de la vider, tu dois etre certain qu'il y a déjà au moins un
élément :
if (comb.count() > 0) {
comb.removeAllItem();
}
puis tu peux ajouter tes éléments comme t'ont montré les autres
for(int i = 0; i < tab.length; i++) {
comb.addItem(tab[i]);
}
C'est un peu barbare de vider à chaque fois, mais au moins ça marche.
Si tu veux juste ajouter un item mais que tu crains qu'il y soit déjà, tu peux
simplement le tester, ce qui ira plus vite...
Amicalement,
--
Thierry Leriche
mailto:thierry...@dinoodoc.com
http://www.dinoodoc.com
GSM. 06 03 79 96 35
#esiea (IRCnet & Undernet)
Dans le meme ordre d'idee mais en utilisant un modele :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Test extends JFrame {
private String[] data;
private JComboBox combo;
public Test() {
super("Test des ComboBox");
Container pane=getContentPane();
pane.setLayout(new GridLayout(1,2));
data=new String[] {"Lundi", "Mardi", "Mercredi"};
pane.add(combo=new JComboBox(data));
JButton button=new JButton("Modifier les valeurs");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Modification des valeurs du tableau");
data[0]="LUNDI";
data[1]="MARDI";
data[2]="MERCREDI";
combo.setModel(new DefaultComboBoxModel(data));
}
});
pane.add(button);
pack();
setVisible(true);
}
public static void main (String[] args) {
new Test();
}
}
Je reconstruis le modele en entier a chaque fois, c'est quand meme pas
tres satisfaisant, mais je vois pas comment faire sinon. Peut-etre
ecrire un modele adapte en implementant l'interface ComboBoxModel pour
que les donnees du modeles soient gerees par un tableau !?
Cordialement
--
Mathieu Peltier
Effectivement!
Il faut que tu cree une classe qui etend DefaultComboBoxModel
public class MyComboModel extends DefaultComboBoxModel
{
}
Tu y met les constructeurs que tu veux (tu peux meme laisser la
classe comme ci-dessus (constructeur par defaut vide!)
Dans ta classe principale tu en crées une instance et tu
l'affectes comme modele à ta combo
DefaultComboBoxModel monModel = new MyComboModel();
JComboBox myCombo = new JComboBox();
myCombo.setModel(monModel);
Pour modifier ta Combo tu passes par le modele et ça met
le controle a jour tout seul (magique!)
monModel.addElement("Element 1");
monModel.addElement("Element 3");
String unTruc="Un Truc";
monModel.addElement(unTruc);
monModel.addElementAt("Element 2",1);
monModel.removeElement(2);
monModel.removeElement(unTruc);
...
J'espére que cela t'aideras
--
Amicalement
Tony
Sent via Deja.com http://www.deja.com/
Before you buy.
On peut en general initialiser les composants Swing avec des
vecteurs ou des tableaux (par exemple, un des constructeurs de
JComboBox prend un vecteur en parametre). Quand on initialise un
composant de cette facon, le composant copie les donnees du
vecteur ou du tableau afin de les afficher puis "LAISSE TOMBER"
ce vecteur ou ce tableau. Conclusion, si on modifie le vecteur
ou le tableau, rien ne se passe dans ce composant.
Les composants swing utilisent une methode beaucoup plus
elegante que je m'en vais expliquer : le modele MVC (pour plus
d'info, tapez MVC dans un BON moteur de recherche comme Google)
MVC signifie Model View Controler. TRES GROSSIEREMENT, le model
constitue l'ensemble de vos données, le view represente le
composant qui va afficher vos donnees et le controler sert a
gerer les actions de l'utilisateur (Les composant Swing jouent a
la fois le role de view et de controler).
Le principe de fonctionnement est le suivant : on dispose d'un
modele (c'est a dire d'un ensemble de donnees), et on va
demander a une ou plusieurs views d'afficher ces données (par
exemple un tableau et un diagramme camembert). Pour pouvoir
afficher les données du model, les views doivent s'abonner a ce
dernier. Lorsqu'une modification survient dans le modele,
celui-ci informe tous ces abonnes qu'il a ete modifie et ceux-ci
en profitent pour se rafraichir. De la meme facon si on modifie
les donnees dans l'une des vues (par exemple on saisit une
valeur dans une JList), le controler va repercuter cette modif
dans le modele et le modele va en informer tous ses abonnes.
On a ainsi une synchronisation parfaite entre model et view TOUT
EN DECOUPLANT DONNEES ET INTERFACE GRAPHIQUE.
Pour ceux qui trouveraient cela assez flou, un bel exemple est
Excel : supposons qu'on dispose d'une feuille excel representant
des donnees, un diagramme camembert et une courbe affichant ces
meme donnees ; ces trois elements (feuille, camembert et
courbe) constituent des views ; le model est gere en interne par
Excel. Et bien si on modifie les valeurs par l'intermediaire de
la feuille, camembert et courbe sont mis a jour.
Passons a Swing maintenant. la majorite des composants swing
peuvent s'abonner a des modeles. Ainsi un JComboBox peut
s'abonner a un modele de type ComboBoxModel par l'intermediaire
de son constructeur ou de la fonction setModel(...). Reste a
savoir comment constituer son modele. Il faut savoir qu'un
modele est defini par une interface. Ainsi ComboBoxModel est une
interface. Vous pouvez donc creer votre propre modele en
implementant cette interface mais c'est peut être compliquer
pour debuter. Une autre solution consiste a utiliser un modele
tout fait . Je pense qu'il en existe pour la majorite des
interfaces definissant des modeles. Le modele par defaut associe
a ComboBoxModel est DefautComboBoxModel.
En conclusion pour utiliser un modele, il faut :
1) instancier un modele
ex: ComboBoxModel myModel = new DefaultComboBoxModel(myVector);
ou myVector est un vecteur contenant les données necessaires
pour initialiser le modele
2) abonner la vue au modele
ex : JComboBox myCombo = new JComboBox();
myCombo.setModel(myModel);
3) si vous devez modifier les donnees a afficher, modifiez le
contenu du modele avec les methodes qu'il propose (ne modifiez
pas le vecteur que vous avez passe au constructeur du modele, ca
ne modifiera pas le modele et ca ne changera donc rien a ce qui
est affiche)
ex : myModel.addElement("nouvelle entree dans le combo");
O magie ! le combo affiche la nouvelle valeur (si si vous avez
abonne plusieurs combo au meme modele, tout les combo sont mis a
jour)
Si vous avez compris cela, vous etes sauve parce que c'est le
meme principe pour les JList, JTable, ...
Enjoy it !
Pour plus d'info :
tapez MVC dans www.google.com : ca c'est pour des info sur le
MVC
lisez le chapitre sur le pattern observer dans la bible qu'est
"Design Patterns, Element of reusable object-oriented software"
MAIS problème de compilation :
Je fais :
String [] recipients = {"bonjour", "aurevoir"};
ComboBoxModel myModel = new DefaultComboBoxModel(recipients);
JComboBox combo = new JComboBox ();
combo.setModel(myModel);
J'obtient sur la dernière ligne :
Identifier Expected
j'ai déjà eu ce pb avec d'autres lignes de code et jamais résolu ??!