Forum Clubic

Lien entre fenêtres

Salut !
J’ai deux fenêtres, chacune contient un bouton+actionperformed, j’exécute la première fenêtre puis je clique sur le bouton pour lancer la deuxième fenêtre, le code des deux boutons est comme suit :
Fenêtre1 :

Int i=0 ;
Bouton1.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
	Fenetre2  fen2=Fenetre2();
Fen2.setVisible(true);
Fen2.pack();
i++;
	}
	});

Fenêtre2 :

Bouton2.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
	System.out.println(“ I =”+i);
	}
	});

Si je clique sur le bouton de la fenetre2 il affiche la valeur de i incrémenté à chaque fois mais malheureusement il affiche toujours i=0 ;
Comment faire le lien entre les deux fenêtres pour l’incrémentation à chaque clique sur le bouton de la fenêtre.
Merci d’avance.

évite de taper tes codes sources dans Word :slight_smile:

pour ton problème, la solution est simple: il a copié i en tant que membre privé de ton action listener (un truc dans le genre je subbodore), et donc dans l’autre cas, il n’accède jamais à une valeur modifiée.

Pour résoudre ton problème, tu peux faire un objet en bon et due forme, et t’en servir:

final Machin x = new Machin(); // + i 
Bouton1.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
	Fenetre2 fen2=Fenetre2(x); // requiert un constructeur ad hoc
Fen2.setVisible(true);
Fen2.pack();
x.i++;
	}
	});

Bouton2.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
	System.out.println(“ I =”+x.i);
	}
	});

merci pour ta répense :slight_smile:
mais si dans le bouton de la premiére fenétre j’execute une commade DOS :

try{
                        
                    Runtime.getRuntime().exec("java Fenetre2");
                }
                catch(java.io.IOException e1) {
                    e1.printStackTrace();
                }

dans ce cas comment garder i (fene1 fen=new fene1(x)) ?
merci encore une fois.

T’as plusieurs façon: par fichiers, par tubes (communication inter processus), par mémoire partagée (je pense que c’est possible, mais peut-être pas entre thread), par sockets (serveur/client), …

Mais honnêtement, t’as plus vite fait d’ouvrir ta frame directement, ça te permettra de conserver le classpath, et en conséquence d’éviter les erreurs © avis perso

merci sans-Nom pour ton aide , j’ai résolu le problème :
pour le bouton de la fenêtre 1 on met:

try{
                        
                    Runtime.getRuntime().exec("java fene1 "+i);
                    //dispose();
                }
                catch(java.io.IOException e1) {
                    e1.printStackTrace();
                }
	
		i++;

et pour la deuxiéme fenetre on met :

public static void main(String args[]){
	int i = Integer.parseInt(args[0]);
		fene1 fen=new fene1(i);
		fen.setVisible(true);
		fen.pack();
		
		
		
		}

merci encore une fois

Tu as ce choix là, mais tu vas relancer Java + la fenêtre à chaque fois que tu veux afficher ton i, ce qui n’est -entre nous - pas très malin.

  1. java = lourd, et au passage c’est javaw qu’il faut utiliser sinon tu risque d’afficher la console (fort heureusement pas depuis exec()
  2. tu peux faire exactement pareil sans créer de nouveau processus

A voir