package fr.developpez; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; @SuppressWarnings("serial") public class SampleFrame extends JFrame { public SampleFrame() { super("Demo fermeture"); // menu setJMenuBar(createMenu()); // bouton getContentPane().add(createButtonPanel()); // fermeture par le bouton croix setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // pour que windowClosed soit appelée addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("Action croix de la fenêtre"); close(); // appel de la méthode de fermeture } @Override public void windowClosed(WindowEvent e) { System.out.println("Closed..."); doOnClose(); } }); /* // fermeture par le bouton croix, avec DISPOSE_ON_CLOSE (décommenter et commenter les deux lignes précédentes pour voir) setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("Action croix de la fenêtre"); // inutile de mettre un appel à dispose ici } @Override public void windowClosed(WindowEvent e) { System.out.println("Closed..."); doOnClose(); } }); */ setMaximumSize(new Dimension(200,200)); setSize(100,100); setLocationRelativeTo(null); } /** * Méthode de fermeture de la fenêtre : qu'on peut appeler d'un code externer */ public void close() { this.dispose(); } /** * Cette méthode contient le code qu'on veut faire lorsqu'on ferme la fenêtre quelque soit la ménière * @return */ protected void doOnClose() { System.out.println("La fenêtre a été fermée..."); } private JMenuItem createCloseMenu() { JMenuItem menu = new JMenuItem("Fermer fenêtre"); menu.addActionListener((event)-> { System.out.println("Action menu"); close(); }); return menu; } private JButton createCloseButton() { JButton button = new JButton("Fermer fenêtre"); button.addActionListener((event)-> { System.out.println("Action bouton"); close(); }); return button; } private JMenuBar createMenu() { JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("menu"); menuBar.add(menu); menu.add(createCloseMenu()); return menuBar; } private JPanel createButtonPanel() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(createCloseButton(), BorderLayout.NORTH); return panel; } public static void main(String[] args) { SampleFrame frame = new SampleFrame(); frame.setVisible(true); // fermeture par un code externe new OtherFrame(frame); } private static class OtherFrame extends JFrame { public OtherFrame(SampleFrame frame) { setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); setUndecorated(true); getContentPane().add(createPanel(frame)); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { OtherFrame.this.dispose(); } }); setVisible(true); pack(); locateFrame(frame); frame.addComponentListener(new ComponentAdapter() { @Override public void componentMoved(ComponentEvent e) { locateFrame(frame); } @Override public void componentResized(ComponentEvent e) { locateFrame(frame); } @Override public void componentHidden(ComponentEvent e) { OtherFrame.this.setVisible(false); } @Override public void componentShown(ComponentEvent e) { OtherFrame.this.setVisible(true); } }); } private void locateFrame(JFrame frame) { setLocation(frame.getX() + (frame.getWidth() - getWidth())/2, frame.getY() + frame.getHeight() + 32); } private JPanel createPanel(SampleFrame frame) { JPanel panel = new JPanel(); CardLayout cardLayout = new CardLayout(); panel.setLayout(cardLayout); JLabel label = new JLabel(); panel.add(label,"label"); panel.add(createButton(frame, cardLayout, panel, label),"button"); cardLayout.show(panel, "button"); return panel; } private Component createButton(SampleFrame frame, CardLayout cardLayout, JPanel panel, JLabel label) { JButton button=new JButton("Lancer un thread qui ferme la fenêtre"); button.addActionListener((event)->{ button.setEnabled(false); cardLayout.show(panel, "label"); launchThread(frame, label); }); return button; } private void launchThread(SampleFrame frame, JLabel label) { new Thread() { public void run() { try { label.setText("2 secondes..."); Thread.sleep(1000); label.setText("1 secondes..."); Thread.sleep(1000); } catch (InterruptedException e) { } label.setText(""); System.out.println("Action d'appel depuis un code quelconque"); frame.close(); // appel de la méthode de fermeture } }.start(); } } }