2012-08-31 5 views
5

Ich mache eine Textverarbeitung, um Java zu üben, und ich möchte es so, dass, wenn der Benutzer versucht, die Anwendung zu schließen, ein JFrame auftauchen wird, um Änderungen zu speichern.setDefaultCloseOperation zeigt stattdessen einen JFrame

Ich habe über setDefaultCloseOperation() nachgedacht, aber ich hatte bisher wenig Glück. Ich würde es auch gerne sehen, wenn der Benutzer, wenn möglich, auch auf das "X" oben rechts im Fenster klickt.

Antwort

9

Sie können die JFrame DefaultCloseOperation auf etwas wie DO_NOTHING setzen und dann einen WindowsListener setzen, um das close-Ereignis zu übernehmen und das zu tun, was Sie wollen. Ich werde ein Exemplar in ein paar Minuten veröffentlichen.

EDIT: Hier ist das Beispiel:

public static void main(String[] args) { 
     final JFrame frame = new JFrame("Test Frame"); 

     frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

     frame.setSize(800, 600); 

     frame.addWindowListener(new WindowAdapter() { 
      //I skipped unused callbacks for readability 

      @Override 
      public void windowClosing(WindowEvent e) { 
       if(JOptionPane.showConfirmDialog(frame, "Are you sure ?") == JOptionPane.OK_OPTION){ 
        frame.setVisible(false); 
        frame.dispose(); 
       } 
      } 
     }); 

     frame.setVisible(true); 
    } 
+0

1) ITYM 'frame.addWindowListener (new Window() {' (sonst ist es ein Übersetzungsfehler) 2) Die JRE wird nicht enden, da der EDT läuft noch. Hier ist einer der seltenen Fälle, in denen das Aufrufen von 'System.exit (0)' notwendig sein könnte. –

+0

@AndrewThompson was würden Sie vorschlagen, der sicherste Weg zu sein, eine Anwendung anstelle von System.exit (0) zu schließen; ? – Andrei0427

+0

Nun, Sie könnten zuerst die laufenden Threads betrachten und prüfen, ob nur der EDT noch läuft. In diesem Fall wäre es sehr sicher, die JVM mit 'System.exit (0)' zu beenden. Aber es gibt eine bessere Lösung hier, siehe meine Antwort .. –

3
  • Sie haben eine WindowListener zum JFrame hinzuzufügen.

  • Innerhalb der windowClosing Methode können Sie erforderlichen Code bereitstellen.

. Zum Beispiel:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class ClosingFrame extends JFrame { 

    private JMenuBar MenuBar = new JMenuBar(); 
    private JFrame frame = new JFrame(); 
    private static final long serialVersionUID = 1L; 
    private JMenu File = new JMenu("File"); 
    private JMenuItem Exit = new JMenuItem("Exit"); 

    public ClosingFrame() { 
     File.add(Exit); 
     MenuBar.add(File); 
     Exit.addActionListener(new ExitListener()); 
     WindowListener exitListener = new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       int confirm = JOptionPane.showOptionDialog(frame, 
         "Are You Sure to Close this Application?", 
         "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
         JOptionPane.QUESTION_MESSAGE, null, null, null); 
       if (confirm == JOptionPane.OK_OPTION) { 
        System.exit(0); 
       } 
      } 
     }; 
     frame.addWindowListener(exitListener); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.setJMenuBar(MenuBar); 
     frame.setPreferredSize(new Dimension(400, 300)); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class ExitListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int confirm = JOptionPane.showOptionDialog(frame, 
        "Are You Sure to Close this Application?", 
        "Exit Confirmation", JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE, null, null, null); 
      if (confirm == JOptionPane.OK_OPTION) { 
       System.exit(0); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ClosingFrame cf = new ClosingFrame(); 
      } 
     }); 
    } 
} 
3
import java.awt.event.*; 
import javax.swing.*; 

public class QuickGuiTest { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       final JFrame frame = new JFrame("Test Frame"); 

       frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
       frame.setSize(600, 400); 
       frame.addWindowListener(new WindowAdapter() { 
        @Override 
        public void windowClosing(WindowEvent e) { 
         int result = JOptionPane.showConfirmDialog(
           frame, "Are you sure?"); 
         if(result==JOptionPane.OK_OPTION){ 
          // NOW we change it to dispose on close.. 
          frame.setDefaultCloseOperation(
            JFrame.DISPOSE_ON_CLOSE); 
          frame.setVisible(false); 
          frame.dispose(); 
         } 
        } 
       }); 
       frame.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}