Passage de variable d'un JFrame à une autre

wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009 - 21 sept. 2009 à 15:58
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 23 sept. 2009 à 20:05
Bonjour,

Je cherche comment passer une variable d'une JFrame a une autre; je m'explique :
j'ai un formulaire ou il y a de multiple titre de test avec leurs résultats.
quand on clique sur un test, ca ouvre une JFrame avec le formulaire a remplir et quand on valide, le score du test s'affiche a coté du titre sur la fenetre principal.
Je sais pas si j'ai été claire...
merci de votre aide

wis

12 réponses

ouabida10 Messages postés 57 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 9 janvier 2011 1
21 sept. 2009 à 16:12
salut mon ami il vous suffi de diclaré un variable "public static" et achaque fois passez la valeur de score pour ce variable
et pour l'affichi en titre de la deuseime fenetre plaçer ce code dans l'evenemnt "WindowOpened"
le code:
 this.setTitle(""+F1.score);


F1 : c'est la class ou vous avez déclaré votre variable public static
score : c'est votre variable publlic static
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 sept. 2009 à 16:12
Salut,

Il te suffit de faire des getters dans ta classe contenant les données à récupèrer. C'est le B.A.-BA de la programmation en objet.
______________________________________
DarK Sidious
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
21 sept. 2009 à 16:14
Salut,

ouabida10 : ta méthode, c'est le meilleur moyen de faire du code qui marche pas !

Déjà il faut éviter d'utiliser des variables static... car elles sont partagées par toutes les instances d'une classe !
Et il ne faut surtout pas déclarer une variable en public au niveau d'une classe car tu perds tout la maîtrise de qui la modifie ! Et puis niveau encapsulation c'est vraiment pas terrible...

Mais merci quand même pour ta participation
______________________________________
DarK Sidious
0
ouabida10 Messages postés 57 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 9 janvier 2011 1
21 sept. 2009 à 16:19
brvo .....mon ami merci .........
0

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

Posez votre question
wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009
22 sept. 2009 à 18:33
Merci d'avoir pris le temps de me répondre c'est très gentils.
je programme beaucoup en php mais c'est mon premier vrais programme en java et ça change !!

euh après quelques heures de test, je n'y arrive toujours pas.
je ne sais pas si c'est juste une question de rafraichir la fenêtre mère ...
je me permet de vous donnez le bout de code qui ne fonctionne pas, j'ai effacer toutes les modifs que j'avais fait car a force ça devenais plus vraiment cohérent.
c'est donc le score qu'il y a sur la fenêtre mère qui doit évoluer en fonction du score générer par la fenêtre filles.
petite précision, c'est avec swing en application autonome.
Merci en tout cas.

je ne met pas le code de lancement (main)

voici la fenêtre mère

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class principal extends JFrame{
/**
 * 
 */
private static final long serialVersionUID =  2;
private JLabel AvScore;
private JLabel ApScore;
private JLabel ScoreAF;
private int Score;
private JButton bttest;

public principal(){
super();

build();
}

private void build(){
Score = 1;
setSize(1200,750); 
setLocationRelativeTo(null); 
setResizable(true); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(buildContentPane());
}

public JPanel buildContentPane(){
JPanel Ppanel = new JPanel();
Ppanel.setLayout(new BorderLayout());
Ppanel.setBackground(Color.white);
this.setSize(1000, 100);
AvScore = new JLabel("<html> Score :  </html>");
ApScore  = new JLabel("<html>/10 points</html>");
ScoreAF =  new JLabel("" + Score);

Box conteneurtest2 = Box.createHorizontalBox();
conteneurtest2.add(AvScore);
conteneurtest2.add(ScoreAF);
conteneurtest2.add(ApScore);


JPanel panelD = new JPanel();
panelD.setLayout(new FlowLayout());
    panelD.setBackground(Color.white);

   	GridLayout experimentLayout = new GridLayout(0,2);
JPanel tableauD = new JPanel();
//tableauD.setBackground(Color.white);
tableauD.setLayout(experimentLayout);


bttest = new JButton("lancer le test");
bttest.addActionListener(actionListenerBT);
tableauD.add(bttest);
tableauD.add(conteneurtest2);
tableauD.add(panelD);
Ppanel.add(tableauD);

return Ppanel;
}

 ActionListener actionListenerBT = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
    	
    	if(abstractButton == bttest){
    		
System.out.println("ok");
    
    		test2 fenetretest = new test2();
fenetretest.setVisible(true);

    	}

      }
        
 		};
};


et le code de la fenêtre fille contenant le forumulaire :
import java.awt.*;
//import java.awt.FlowLayout;
import java.awt.event.*;

import javax.swing.*;

public class test2 extends JFrame{
/**
 * 
 */
private static final long serialVersionUID = 2;
private JLabel TitreMC;
private JLabel AvScore;
private JLabel ApScore;
//private JLabel Score2;
private JLabel en2_1;
private JLabel en2_2;
private JLabel en2_3;
private JLabel en2_4;
private JLabel en2_5;
private JLabel en2_6;
private JLabel en2_7;
private JLabel en2_8;
private JLabel en2_9;
private JLabel en2_10;
private JCheckBox ch2_1;
private JCheckBox ch2_2;
private JCheckBox ch2_3;
private JCheckBox ch2_4;
private JCheckBox ch2_5;
private JCheckBox ch2_6;
private JCheckBox ch2_7;
private JCheckBox ch2_8;
private JCheckBox ch2_9;
private JCheckBox ch2_10;
private JButton fermerfenetre;
private JLabel Score;

private static String DESELECTED_LABEL = "0";
private static String SELECTED_LABEL = "1";

public test2(){
super();
build();
}

private void build(){
setTitle("Examen pour un enfant de 6 ans");
setSize(1100,500);
setLocationRelativeTo(null);
setResizable(true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setContentPane(buildContentPane());
}

private JPanel buildContentPane(){
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.setBackground(Color.white);
 ActionListener actionListenerBT = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
    	
    	if(abstractButton == fermerfenetre){
    		setVisible(false);
    	}		        
      }
    };
  
    
ActionListener actionListener = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
        AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
        boolean selected = abstractButton.getModel().isSelected();
        String newLabel = (selected ? SELECTED_LABEL : DESELECTED_LABEL);
        String scoreF = Score.getText();
        double scoreFF = Double.parseDouble(scoreF);
        if( newLabel == "1" ){
        	 scoreFF++;
        }else{
        	scoreFF--;
        
        }
        
        Score.setText( "" + scoreFF);
      }
    };


    TitreMC = new JLabel("<html> 2-Mémoire des chiffres  
 </html>");
AvScore  = new JLabel("<html>Score : </html>");
ApScore =  new JLabel("<html> /10 points maximun (1 pts par série de chiffre) </html>");
Score  = new JLabel("0");

Box premierelignebox = Box.createHorizontalBox();

premierelignebox.add(TitreMC);
premierelignebox.add(AvScore);
premierelignebox.add(Score);
premierelignebox.add(ApScore);

en2_1 = new JLabel("4-9");
en2_2 = new JLabel("7-2");
en2_3 = new JLabel("3-7-9");
en2_4 = new JLabel("6-8-3");
en2_5 = new JLabel("8-1-5-9");
en2_6 = new JLabel("4-2-6-1");
ch2_1 = new JCheckBox();
    ch2_1.addActionListener(actionListener);
ch2_2 = new JCheckBox();
ch2_2.addActionListener(actionListener);
ch2_3 = new JCheckBox();
ch2_3.addActionListener(actionListener);
ch2_4 = new JCheckBox();
ch2_4.addActionListener(actionListener);
ch2_5 = new JCheckBox();
ch2_5.addActionListener(actionListener);
ch2_6 = new JCheckBox();
ch2_6.addActionListener(actionListener);

GridLayout experimentLayout = new GridLayout(0,8);
JPanel tableauD = new JPanel();
tableauD.setLayout(experimentLayout);

tableauD.add(en2_1);
tableauD.add(ch2_1);
tableauD.add(en2_2);
tableauD.add(ch2_2);
tableauD.add(en2_3);
tableauD.add(ch2_3);
tableauD.add(en2_4);
tableauD.add(ch2_4);
tableauD.add(en2_5);
tableauD.add(ch2_5);
tableauD.add(en2_6);
tableauD.add(ch2_6);

en2_7 = new JLabel("5-8-3-7-2");
en2_8 = new JLabel("6-9-4-1-8");
en2_9 = new JLabel("8-5-2-9-4-6");
en2_10 = new JLabel("4-2-8-7-3-9");

ch2_7 = new JCheckBox(); 
ch2_7.addActionListener(actionListener);
ch2_8 = new JCheckBox();
ch2_8.addActionListener(actionListener);
ch2_9 = new JCheckBox();
ch2_9.addActionListener(actionListener);
ch2_10 = new JCheckBox();
ch2_10.addActionListener(actionListener);

tableauD.add(en2_7);
tableauD.add(ch2_7);
tableauD.add(en2_8);
tableauD.add(ch2_8);
tableauD.add(en2_9);
tableauD.add(ch2_9);
tableauD.add(en2_10);
tableauD.add(ch2_10);

fermerfenetre = new JButton("Fermer");
fermerfenetre.addActionListener(actionListenerBT);

tableauD.add(fermerfenetre);

Box conteneurtest2 = Box.createVerticalBox();

conteneurtest2.add(premierelignebox);
conteneurtest2.add(tableauD);

panel.add(conteneurtest2); 


return panel;
}

}


merci
wis
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
22 sept. 2009 à 18:46
Salut,

Et bien le plus simple dans ton cas, c'est de faire un getter dans ta classe Test2 (le T en majuscule est voulu : respecte les standard de codage java, ca te facilitera ton apprentissage du langage !) :

public boolean tonGetter() {
return laValeurARenvoyer;
}

Ainsi à partir de ta classe mère, tu peux récupèrer la valeur par l'appel au getter tonGetter.

______________________________________
DarK Sidious
0
wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009
22 sept. 2009 à 19:21
ou si vous avez un exemple je suis preneur aussi ...
merci

wis
0
wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009
22 sept. 2009 à 19:53
Merci pour ta réponse.
En fait, c'est ce que j'avais compris de ta réponse précédente, et j'ai passé l'aprem dessus et il doit y avoir une notion de j'ai pas compris (l'objet reste un peu flou, j'en apprend toutes les heures).

Dans ma fenetre fille (Test2) :
public int scoreGet() {
return ScoreF;
} 


mais dans ma fenetre mère, il ne connais pas scoreGet() ??
comment je peux attribuer ma valeur scoreGet a la variable Score de ma class Principal ??

ca doit te paraitre a toi triviale, mais moi, j'essaye de comprendre mais il doit y avoir un truc de base qui m'a échappé ...

merci en tout cas de ton aide

wis
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
22 sept. 2009 à 20:04
Salut,

Tu veux modifier une valeur de ta classe Principal lorsqu'une valeur est modifié par la classe Test2 c'est cà ?

A ce moment là, il vaut mieux faire un listener, c'est plus standard, et ca marchera dans tout les cas :

tu crée une interface
public interface TonListener() {
  public void valueChanged(Boolean nouvelleValeur);
}


Tu crée ce qu'il faut pour ajouter/supprimer le listener dans ta classe Test2 :

protected List<TonListener> listeners = new LinkedList<TonListener>();
public void addTonListener(TonListener tonListener) {
  listeners.add(tonListener);
}
public void removeTonListener(TonListener tonListener) {
  listeners.remove(tonListener);
}


Tu déclenche l'événement lorsqu'une valeur change dans ta classe Test2 :
taValeur = true; // la valeur change
for (TonListener tonListener : listeners) {
  tonListener.valueChanged(taValeur); // notifie à tout ce qui se sont inscrit au listener que la valeur a changé (et envoie la nouvelle valeur)
}


Enfin, dans ta classe Principale, il faut s'abonner au listener de ta classe Test2 :
tonInstanceDeTaClasseTest2.addListener(new TonListener {
  public void valeurChanged(Boolean nouvelleValeur) {
    // faire ce qu'il y a à faire lorsqu'un valeur est modifiée
  }
});


Il ne s'agit que d'une implémentation basique d'un listener afin que tu comprennes comment ca marche, il y a bien entendu des façons plus optimisé de s'abonner au listener de la classe Test2
______________________________________
DarK Sidious
0
wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009
23 sept. 2009 à 19:21
Je vais encore d'embêter DarK Sidious, mais impossible de mettre en œuvre l'abonnement au listener dans ma classe Principal ( ton 3éme bout de code)
j'ai l'impression de comprendre ta méthode, mais impossible de la mettre en application, c'est frustrant.
en tout cas tu dois en avoir marre de m'aider.
Je te remercie de toute facon pour ta précieuse aide jusqu'a maintenant.

wis
0
wisperhill Messages postés 8 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 23 septembre 2009
23 sept. 2009 à 19:37
Je viens de voire que de toute facon, mon listener ne recois pas d'info
je suis décourager.
merci de ton aide.



wis
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
23 sept. 2009 à 20:05
Salut,

Dans ta classe principale, ca doit donner un truc du genre :
 ActionListener actionListenerBT = new ActionListener() {
   public void actionPerformed(ActionEvent actionEvent) {
     AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
     if(abstractButton.equals(bttest)){
        System.out.println("ok");
        test2 fenetretest = new test2();
        fenetretest.setVisible(true);
        fenetretest.addListener(new TonListener {
          public void valeurChanged(Boolean nouvelleValeur) {
            // faire ce qu'il y a à faire lorsqu'un valeur est modifiée
          }
        });
     }
   }
};

______________________________________
DarK Sidious
0
Rejoignez-nous