j'expose la situation (en essayant de ne mettre que les éléments
intéressants):
1- Class MainFrame extends JFrame
---------------------------------
OptionRecord optionRec = new OptionRecord(); // class avec juste des getter
et des setters
add( new MyTabPane(optionRec));
2- Class MyTabPane extends JPanel
---------------------------------
JTabbedPane tabPane = new JTabbedPane();
tabPane.addPane(new MyPane1(optionRec));
tabPane.addPane(new MyPane2(optionRec));
3- Class MyPane1 extends JPanel
-------------------------------
JLabel monLabel = new JLabel(optionRec.getMonLabel());
JButton getMyLabel = new JButton("Get Label");
setMyLabel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
optionRec.setMyLabel("nouveau label");
}
});
4- Class MyPane2 extends JPanel
-------------------------------
JButton setMyLabel = new JButton("Change Label");
setMyLabel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
optionRec.setMyLabel("nouveau label");
}
});
Voilà je pense qu'il y a tout ce qui est nécéssaire à la compréhension de
mon pb qui est le suivant :
Je vais sur le premier tab (MyPane1) et là j'ai un label où est écrit "xxx"
Je vais sur le deuxième tab (MyPane2) et je clique sur le bouton "Change
Label"
Je retourne sur le premier tab et là j'ai toujours un label où est écrit
"xxx"
je clique sur le bouton getLabel et là le label change bien et devient
"nouveau label"
Je n'arrive pas à faire que le label du premier tab se change
automatiquement lorsque l'on fait une action dans le deuxième.
J'ai bien pensé passer le panel du premier tab dans le constructeur du
MyPane2 afin que l'on puisse directement agir dessus mais cela ne me parait
pas très propre.
ce qui donnerait :
2- Class MyTabPane extends JPanel
---------------------------------
JTabbedPane tabPane = new JTabbedPane();
MyPane1 pane1 = new MyPane1();
MyPane2 pane2 = new MyPane2();
pane2.setPane1(pane1);
tabPane.addPane(pane1);
tabPane.addPane(pane2);
et
4- Class MyPane2 extends JPanel
-------------------------------
JButton setMyLabel = new JButton("Change Label");
setMyLabel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
optionRec.setMyLabel("nouveau label");
pane1.monLabel.setText(optionRec.getMyLabel());
}
});
Est ce une solution 'correct','acceptable' ou bien existerait-il une
solution plus propre ?
Merci d'avance et désolé d'avoir été si long, j'espère avoir été ckair tout
de même.
3- Class MyPane1 extends JPanel -------------------------------
JLabel monLabel = new JLabel(optionRec.getMonLabel()); JButton getMyLabel = new JButton("Get Label"); setMyLabel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { optionRec.setMyLabel("nouveau label"); } });
Comment tu accedes à setMyLabel sachant qu'il est déclaré dans la classe MyPane2 ?
-- Vincent
jocelyn
Salut !
Bon deja je vais essayer de resumer ce que j'ai compris, (car je crois que ton 3eme post est egalement foireux...) Tu as un Panel avec 2 TabbedPane. Dans chaque TabbedPane tu as un Label qui est censé refléter la valeur d'un attribut myLabel d'un objet OptionRecord. D'autre part dans le 1er TabbedPane tu as un bouton permettant de récuperer la valeur courante de cet attribut et de l'afficher dans les 2 TabbedPane. Le 2eme TabbedPane contient un bouton permettant de donner une valeur quelconque à l'attribut.C bien ca ?
Ton problème est que tu voudrais que l'affichage de l'attribut myLabel dans les 2 TabbedPane soit synchrone. Bon deja la solution que tu proposes, meme si elle marche, ne me parait pas bonne car ca veut dire que les panneaux freres doivent se connaitre entre eux, ce qui va engendrer un couplage tres contraignant au niveau maintenance du code et éventuellement réutilisabilité. Imagine par exemple que tu doives + tard ajouter d'autres panneaux...
Le comportement que tu veux implémenter me parait vraiment de type événementiel. Sur l'événement "récupération de la valeur de l'attribut" tu veux mettre à jour tous les labels. On pourrait meme imaginer que tu veuilles le faire à la mise à jour de l'attribut (je pense que tu ne seras pas contre). Dans ce cas, tu peux à mon avis utiliser un pattern du style Observer/Observable qui te simplifiera grandement la tache.
Si cette solution ne te convient pas, par exemple si tu souhaites vraiment dissocier les événements "mise à jour de l'attribut" et "récupération de l'attribut", ou bien que mettre en oeuvre un pattern pour 2 labels te parait un peu demesure, tu peux faire comme suit (il y a plein de solutions en fait et celle-ci peut être améliorée): Tu centralises la mise à jour des labels au niveau le + haut, c'est à dire le JFrame, qui elle peut connaitre tous ses fils de maniere logique, et réciproquement.
Dans la classe MainFrame: JTabbedPane tabPane = new JTabbedPane(); MyPane1 myPane1 = new MyPane1(optionRec, this); MyPane2 myPane2 = new MyPane2(optionRec, this); tabPane.addPane(myPane1); tabPane.addPane(myPane2);
public void majLabels() { myPane1.setValeurLabel(); myPane2.setValeurLabel(); }
Dans les classes MyPane1 et 2: public void setValeurLabel() { monLabel.setText(optionRec.getMyLabel()); }
Dans la classe MyPane2:
public void actionPerformed(ActionEvent arg0) { papa.majLabels(); }
Voila ca vaut ce que ca vaut et ca n'engage que moi :) ++
-- Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne pas devenir un monstre lui-même
Salut !
Bon deja je vais essayer de resumer ce que j'ai compris, (car je crois que
ton 3eme post
est egalement foireux...)
Tu as un Panel avec 2 TabbedPane. Dans chaque TabbedPane tu as un Label qui
est censé
refléter la valeur d'un attribut myLabel d'un objet OptionRecord. D'autre
part dans le 1er
TabbedPane tu as un bouton permettant de récuperer la valeur courante de cet
attribut et
de l'afficher dans les 2 TabbedPane. Le 2eme TabbedPane contient un bouton
permettant
de donner une valeur quelconque à l'attribut.C bien ca ?
Ton problème est que tu voudrais que l'affichage de l'attribut myLabel dans
les 2 TabbedPane
soit synchrone. Bon deja la solution que tu proposes, meme si elle marche,
ne me parait pas
bonne car ca veut dire que les panneaux freres doivent se connaitre entre
eux, ce qui va engendrer
un couplage tres contraignant au niveau maintenance du code et
éventuellement réutilisabilité.
Imagine par exemple que tu doives + tard ajouter d'autres panneaux...
Le comportement que tu veux implémenter me parait vraiment de type
événementiel. Sur l'événement
"récupération de la valeur de l'attribut" tu veux mettre à jour tous les
labels. On pourrait meme imaginer
que tu veuilles le faire à la mise à jour de l'attribut (je pense que tu ne
seras pas contre). Dans ce cas,
tu peux à mon avis utiliser un pattern du style Observer/Observable qui te
simplifiera grandement la
tache.
Si cette solution ne te convient pas, par exemple si tu souhaites vraiment
dissocier les événements
"mise à jour de l'attribut" et "récupération de l'attribut", ou bien que
mettre en oeuvre un pattern pour 2 labels
te parait un peu demesure, tu peux faire comme suit (il y a plein de
solutions en fait et celle-ci peut être améliorée):
Tu centralises la mise à jour des labels au niveau le + haut, c'est à dire
le JFrame, qui elle peut connaitre tous ses fils de maniere logique, et
réciproquement.
Dans la classe MainFrame:
JTabbedPane tabPane = new JTabbedPane();
MyPane1 myPane1 = new MyPane1(optionRec, this);
MyPane2 myPane2 = new MyPane2(optionRec, this);
tabPane.addPane(myPane1);
tabPane.addPane(myPane2);
public void majLabels() {
myPane1.setValeurLabel();
myPane2.setValeurLabel();
}
Dans les classes MyPane1 et 2:
public void setValeurLabel() {
monLabel.setText(optionRec.getMyLabel());
}
Dans la classe MyPane2:
public void actionPerformed(ActionEvent arg0) {
papa.majLabels();
}
Voila ca vaut ce que ca vaut et ca n'engage que moi :)
++
--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même
Bon deja je vais essayer de resumer ce que j'ai compris, (car je crois que ton 3eme post est egalement foireux...) Tu as un Panel avec 2 TabbedPane. Dans chaque TabbedPane tu as un Label qui est censé refléter la valeur d'un attribut myLabel d'un objet OptionRecord. D'autre part dans le 1er TabbedPane tu as un bouton permettant de récuperer la valeur courante de cet attribut et de l'afficher dans les 2 TabbedPane. Le 2eme TabbedPane contient un bouton permettant de donner une valeur quelconque à l'attribut.C bien ca ?
Ton problème est que tu voudrais que l'affichage de l'attribut myLabel dans les 2 TabbedPane soit synchrone. Bon deja la solution que tu proposes, meme si elle marche, ne me parait pas bonne car ca veut dire que les panneaux freres doivent se connaitre entre eux, ce qui va engendrer un couplage tres contraignant au niveau maintenance du code et éventuellement réutilisabilité. Imagine par exemple que tu doives + tard ajouter d'autres panneaux...
Le comportement que tu veux implémenter me parait vraiment de type événementiel. Sur l'événement "récupération de la valeur de l'attribut" tu veux mettre à jour tous les labels. On pourrait meme imaginer que tu veuilles le faire à la mise à jour de l'attribut (je pense que tu ne seras pas contre). Dans ce cas, tu peux à mon avis utiliser un pattern du style Observer/Observable qui te simplifiera grandement la tache.
Si cette solution ne te convient pas, par exemple si tu souhaites vraiment dissocier les événements "mise à jour de l'attribut" et "récupération de l'attribut", ou bien que mettre en oeuvre un pattern pour 2 labels te parait un peu demesure, tu peux faire comme suit (il y a plein de solutions en fait et celle-ci peut être améliorée): Tu centralises la mise à jour des labels au niveau le + haut, c'est à dire le JFrame, qui elle peut connaitre tous ses fils de maniere logique, et réciproquement.
Dans la classe MainFrame: JTabbedPane tabPane = new JTabbedPane(); MyPane1 myPane1 = new MyPane1(optionRec, this); MyPane2 myPane2 = new MyPane2(optionRec, this); tabPane.addPane(myPane1); tabPane.addPane(myPane2);
public void majLabels() { myPane1.setValeurLabel(); myPane2.setValeurLabel(); }
Dans les classes MyPane1 et 2: public void setValeurLabel() { monLabel.setText(optionRec.getMyLabel()); }
Dans la classe MyPane2:
public void actionPerformed(ActionEvent arg0) { papa.majLabels(); }
Voila ca vaut ce que ca vaut et ca n'engage que moi :) ++
-- Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne pas devenir un monstre lui-même