[Niveau Débutant][Pour les étudiants (ou personnes) qui prennent leurs premiers pas en Java].
La première chose que nous constatons après la création de notre toute première JFrame en Java est la continuation de l'exécution après la fermeture de l'unique fenêtre et même après la fin de la méthode "main". En effet, en créant une JFrame, nous créons un Thread séparé du Thread principal. En fermant la fenêtre, nous la détruisons mais pas le Thread qui l'a exécutée. Ainsi, il faut préciser à la JFrame qu'il faut quitter l'application lors de sa fermeture.
La méthode la plus simple pour cela est l'utilisation de la méthode setDefaultCloseOperation(). Cette méthode est un bon exemple sur l’appellation des méthode suivie dans la JDK et confirme la réputation du Java sur cet axe par rapport à d'autres langages de programmation.
setDefaultCloseOperation() prend un entier qui précise l'action à prendre lors de la fermeture de la fenêtre. Les options disponibles sont :
La première chose que nous constatons après la création de notre toute première JFrame en Java est la continuation de l'exécution après la fermeture de l'unique fenêtre et même après la fin de la méthode "main". En effet, en créant une JFrame, nous créons un Thread séparé du Thread principal. En fermant la fenêtre, nous la détruisons mais pas le Thread qui l'a exécutée. Ainsi, il faut préciser à la JFrame qu'il faut quitter l'application lors de sa fermeture.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExempleJFrame extends JFrame { public ExempleJFrame(){ setTitle("Exemple"); setSize(300, 200); JButton bouton = new JButton("Afficher"); bouton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.out.println("Thread de la JFrame : " + Thread.currentThread().getName()); } }); getContentPane().setLayout(null); bouton.setBounds(100, 85, 100, 25); getContentPane().add(bouton); } public static void main (String args[]) { (new ExempleJFrame()).setVisible(true); System.out.println("Thread principal (méthode main) : " + Thread.currentThread().getName()); } }
La méthode la plus simple pour cela est l'utilisation de la méthode setDefaultCloseOperation(). Cette méthode est un bon exemple sur l’appellation des méthode suivie dans la JDK et confirme la réputation du Java sur cet axe par rapport à d'autres langages de programmation.
setDefaultCloseOperation() prend un entier qui précise l'action à prendre lors de la fermeture de la fenêtre. Les options disponibles sont :
- DO_NOTHING_ON_CLOSE : ne rien faire,
- HIDE_ON_CLOSE : chacher la fenêtre,
- DISPOSE_ON_CLOSE : détruire la fenêtre,
- EXIT_ON_CLOSE : quitter l'application.
On ajoute une seule ligne au code précédent :
Maintenant, l'application rend la main au système après sa fermeture; il n'est plus nécessaire de forcer l'arrêt de l'application par la commande arrêt dans les EDI (un bouton rouge) ou bien Ctrl+C à partir de la ligne de commande.
Java offre aussi la possibilité de personnaliser l'action à prendre lors de la fermeture de la JFrame. Il est aussi possible de détecter tout sorte d'événements sur la fenêtre (modification de la taille, réduction, etc.). Cela est garanti par l'utilisation d'un écouteur pour la fenêtre : WindowListener.
Cet écouteur était l'unique méthode pour définir les actions à prendre lors de la fermeture dans AWT. setDefaultCloseOperation() n'a été introduite que plus tard avec Swing.
WindowListener est, comme tout autre écouteur, une interface qui définit les méthodes de réception des événement. Et si ActionListener ne propose qu'une seule méthode (actionPerformed) parce qu'il n'écoute qu'un seul événement (le clique), WindowListener de son côté définit sept (07) fonctions. Son code source (officiel mais sans Javadoc) :
Vous pouvez lire le code complet avec les commentaires Javadoc :
Ainsi, pour définir l'action à exécuter au moment de la fermeture, il faut implémenter les sept méthodes, laisser toutes les méthodes vides et remplir la méthode windowClosing().
Ainsi, le code de notre fenêtre devient :
Pour simplifier l'utilisation, une autre classe a été introduite, c'est la classe WindowAdapter. Cette classe ne fait rein de particulier; elle implémente toutes les méthodes des differentes interface liées aux JFrame (et Frame) mais avec des corps de méthodes vides. Son code (sans les Javadoc) :
Son code source complet :
Ainsi, le code de la fenêtre devient (avec une exécution identique) :
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Maintenant, l'application rend la main au système après sa fermeture; il n'est plus nécessaire de forcer l'arrêt de l'application par la commande arrêt dans les EDI (un bouton rouge) ou bien Ctrl+C à partir de la ligne de commande.
Java offre aussi la possibilité de personnaliser l'action à prendre lors de la fermeture de la JFrame. Il est aussi possible de détecter tout sorte d'événements sur la fenêtre (modification de la taille, réduction, etc.). Cela est garanti par l'utilisation d'un écouteur pour la fenêtre : WindowListener.
Cet écouteur était l'unique méthode pour définir les actions à prendre lors de la fermeture dans AWT. setDefaultCloseOperation() n'a été introduite que plus tard avec Swing.
WindowListener est, comme tout autre écouteur, une interface qui définit les méthodes de réception des événement. Et si ActionListener ne propose qu'une seule méthode (actionPerformed) parce qu'il n'écoute qu'un seul événement (le clique), WindowListener de son côté définit sept (07) fonctions. Son code source (officiel mais sans Javadoc) :
package java.awt.event; import java.util.EventListener; public interface WindowListener extends EventListener { public void windowOpened(WindowEvent e); public void windowClosing(WindowEvent e); public void windowClosed(WindowEvent e); public void windowIconified(WindowEvent e); public void windowDeiconified(WindowEvent e); public void windowActivated(WindowEvent e); public void windowDeactivated(WindowEvent e); }
Vous pouvez lire le code complet avec les commentaires Javadoc :
Ainsi, pour définir l'action à exécuter au moment de la fermeture, il faut implémenter les sept méthodes, laisser toutes les méthodes vides et remplir la méthode windowClosing().
Ainsi, le code de notre fenêtre devient :
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExempleJFrame extends JFrame { public ExempleJFrame(){ setTitle("Exemple"); setSize(300, 200); addWindowListener(new MonWindowListener()); } public static void main (String args[]) { (new ExempleJFrame()).setVisible(true); } } class MonWindowListener implements WindowListener { public void windowOpened(WindowEvent e){} public void windowClosing(WindowEvent e){ System.out.println("La fenêtre a été fermée"); System.exit(0); } public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} }
![]() |
Avant la fermeture |
![]() |
Après la fermeture, l'application rend la main au système ( avec le code 0 passé comme paramètre à la fonction System.exit(0) ) |
public abstract class WindowAdapter implements WindowListener, WindowStateListener, WindowFocusListener { public void windowOpened(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowStateChanged(WindowEvent e) {} public void windowGainedFocus(WindowEvent e) {} public void windowLostFocus(WindowEvent e) {} }
Son code source complet :
Ainsi, le code de la fenêtre devient (avec une exécution identique) :
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ExempleJFrame extends JFrame { public ExempleJFrame(){ setTitle("Exemple"); setSize(300, 200); addWindowListener(new MonWindowAdapter()); } public static void main (String args[]) { (new ExempleJFrame()).setVisible(true); } } class MonWindowAdapter extends WindowAdapter { @Override public void windowClosing(WindowEvent e){ System.out.println("La fenêtre a été fermée"); System.exit(0); } }