2012-05-28 3 views
-1

J'ai une fenêtre principale JFrame avec un JButton. Quand je clique sur le bouton une nouvelle fenêtre est ouverte, mais quand je veux fermer la deuxième fenêtre, les deux fenêtres sont fermées! Je veux que le premier s'ouvre tout le temps. Est-il possible de fermer uniquement la deuxième fenêtre? Prévoyez de l'aide! Merci!Les deux fenêtres se ferment?

EDIT: J'ai ajouté un nouveau code pour montrer mon problème. Classe GUI1 a un cadre principal et un bouton pour ouvrir une deuxième image, GUI2, qui a un bouton pour fermer la trame GUI2. C'est la partie finale de GUI2 que je ne peux pas résoudre. Le code est simple et juste pour tester.

GUI1

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class GUI1 extends JFrame implements ActionListener{ 
JButton btn1; 
Container contentPane; 
public GUI1() 
{ 
    setTitle("GUI 1"); 
    setResizable(false); 
    setSize(600,300); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    contentPane = getContentPane(); 
    contentPane.setLayout(new FlowLayout()); 
    btn1 = new JButton("Open GUI 2 frame"); 
    contentPane.add(btn1); 
    btn1.setFocusable(false); 
    btn1.addActionListener(this); 
} 
public void actionPerformed(ActionEvent event){ 
    if(event.getSource() == btn1) 
    { 
     GUI2 frame2 = new GUI2(); 
     frame2.setVisible(true); 
    } 
} 
public static void main(String[] args) { 
    GUI1 frame = new GUI1(); 
    frame.setVisible(true); 
} 
} 

GUI2

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class GUI2 extends JFrame implements ActionListener { 
Container contentPane; 
JButton btn2; 
public GUI2() 
{ 
    setTitle("GUI 2"); 
    setResizable(false); 
    setSize(400,200); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    contentPane = getContentPane(); 
    contentPane.setLayout(new FlowLayout()); 
    btn2 = new JButton("Close GUI 2 frame"); 
    contentPane.add(btn2); 
    btn2.addActionListener(this); 
} 
public void actionPerformed(ActionEvent event){ 
    if(event.getSource() == btn2) 
    { 
     // Close GUI2 ?? 
    } 
} 
} 
+0

vous devriez probablement utiliser la constante au lieu de '3' pour l'opération de fermeture par défaut, pour le rendre plus clair. est 3 sortie à proximité? – DHall

+1

Voir [L'utilisation de plusieurs JFrames, bonne/mauvaise pratique?] (Http://stackoverflow.com/a/9554657/418556) Il est 'JFrame.DISPOSE_ON_CLOSE', mais ** voir [L'utilisation de plusieurs JFrames, Bon/Mauvais Pratique?] (Http://stackoverflow.com/a/9554657/418556) ** –

+1

Oh, et n'utilise pas de 'nombres magiques' - je dois admettre que je n'ai pas eu besoin de jeter un coup d'œil à l'extrait avant de deviner le problème. –

Répondre

2

Après une deuxième lecture, je suis d'accord avec les autres quand ils disent que vous ne devriez pas être en train de créer et de jeter JFrames (ou en utilisant JFrames multiples du tout). Mais si vous voulez vraiment suivre cette voie, je suggérerais:

  • Créez un JFrame unique, et stockez une référence là où vos boutons peuvent accéder;
  • Show l'image lorsque le bouton "Ajouter" est enfoncé;
  • Utiliser JFrame.HIDE_ON_CLOSE au lieu de 3 (quitter à la fermeture) - ne pas utiliser de nombres magiques;
  • Hide le cadre lorsque l'autre bouton est enfoncé.

Mise à jour: les étapes pour appliquer les suggestions ci-dessus à votre architecture sont:

  • ajouter un champ à votre GUI1 classe - private GUI2 frame - et créer seulement une fois (dans le constructeur de GUI1 pour exemple);
  • dans votre actionPerformed, utilisez uniquement frame.setVisible(true) - puisque le cadre a déjà été créé;
  • Je crois que vous pourriez garder votre DISPOSE_ON_CLOSE sur GUI2, si vous le souhaitez, mais HIDE_ON_CLOSE est plus approprié;
  • puisque c'est GUI2 - le JFrame - qui implémente l'écouteur d'action, vous avez déjà une référence: this! Utilisez this.setVisible(false) ou simplement setVisible(false).
+0

OK, Nice! Mais si je voudrais fermer la deuxième image avec un JButton? –

+1

Alors fermez-le avec un bouton. En action, appelez 'theFrame.dispose()', mais si vous ne l'avez pas entendu auparavant, *** .. Voir [L'utilisation de plusieurs JFrames, Good/Bad Practice?] (Http://stackoverflow.com/ a/9554657/418556) *** –

+0

Mais mon bouton est dans la deuxième image, et la référence pour la deuxième image est dans la classe de la première image. Comment puis-je appeler theFrame.dispose() à partir de la deuxième fenêtre? –

0

Changement: frame2.setDefaultCloseOperation(3);-frame2.setDefaultCloseOperation(DISPOSE_ON_CLOSE); et il devrait fonctionner

2

J'ai une fenêtre principale DFrame avec un JButton. Quand je clique sur le bouton une nouvelle fenêtre est ouverte, mais quand je veux fermer la deuxième fenêtre, les deux fenêtres sont fermées!

1.Utilisez CardLayout plutôt que de créer un groupe de JFrames sur le moteur d'exécution, le concept vraiment très mauvais, ces objets jamais allé de UsedMemory, ni être GC'ed

2.utilisez HIDE_ON_CLOSE au lieu de DISPOSE_ON_CLOSE

Questions connexes