Je ne comprends pas comment utiliser ce code:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pour fermer le programme avec le bouton x.
Vous avez besoin de la ligne
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Parce que le comportement par défaut du JFrame lorsque vous appuyez sur le bouton X est équivalent à
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
Donc, presque toutes les fois où vous aurez besoin d'ajouter cette ligne manuellement lors de la création de votre JFrame
Je fais actuellement référence aux constantes dans WindowConstants
, comme WindowConstants.EXIT_ON_CLOSE
au lieu des mêmes constantes déclarées directement dans JFrame
, car les précédentes reflètent mieux l'intention.
Si vous ne l'avez pas, le JFrame sera simplement éliminé. Le cadre se fermera, mais l'application continuera à s'exécuter.
Appeler setDefaultCloseOperation(EXIT_ON_CLOSE)
fait exactement cela. Cela provoque la fermeture de l'application lorsqu'elle reçoit un événement de la fenêtre de fermeture du système d'exploitation. En appuyant sur le bouton fermer (X) de votre fenêtre, le système d'exploitation génère un événement de fermeture de la fenêtre et l'envoie à votre application Java. L'événement de fermeture de la fenêtre est traité par la boucle d'événements AWT dans votre application Java qui la quittera en réponse à l'événement.
Si vous n'appelez pas cette méthode, la boucle d'événements AWT ne peut pas quitter l'application en réponse à l'événement de fermeture de la fenêtre, mais la laisser s'exécuter en arrière-plan .
J'ai passé pas mal de temps à utiliser Internet pour trouver une solution élégante à ce problème. Comme d'habitude, j'ai trouvé beaucoup d'informations contradictoires.
J'ai finalement fini avec:
EXIT_ON_CLOSE
car cela peut laisser des ressources derrière;Utilisez quelque chose comme ceci dans l’initialisation de JFrame:
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
La véritable découverte consistait à envoyer un message de fenêtre à JFrame. Par exemple, dans le cadre de votre JMenuItem pour quitter l'application, utilisez ce qui suit, dans lequel la fonction getFrame()
renvoie une référence à JFrame:
public class AppMenuFileExit extends JMenuItem implements ActionListener
{
// do your normal menu item code here
@Override
public void actionPerformed(ActionEvent e)
{
WindowEvent we;
we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
App.getFrame().dispatchEvent(we);
}
}
JFrame est une sous-classe de Window et peut donc être converti dans Window à cette fin.
Et, dans votre classe JFrame, disposez des éléments suivants pour gérer les messages Windows:
public class AppFrame extends JFrame implements WindowListener
{
// Do all the things you need to for the class
@Override
public void windowOpened(WindowEvent e)
{}
@Override
public void windowClosing(WindowEvent e)
{/* can do cleanup here if necessary */}
@Override
public void windowClosed(WindowEvent e)
{
dispose();
System.exit(0);
}
@Override
public void windowActivated(WindowEvent e)
{}
@Override
public void windowDeactivated(WindowEvent e)
{}
@Override
public void windowDeiconified(WindowEvent e)
{}
@Override
public void windowIconified(WindowEvent e)
{}
}
Si vous utilisez un cadre (Class Extends Frame), vous ne recevrez pas le
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
cela a fonctionné pour moi dans le cas de Class Extends Frame
Si vous ne prolongez pas JFrame
et utilisez JFrame
lui-même dans variable, vous pouvez utiliser:
frame.dispose();
System.exit(0);
Le code suivant fonctionne pour moi:
System.exit(home.EXIT_ON_CLOSE);