webentwicklung-frage-antwort-db.com.de

Java - Wie verhindere ich, dass WindowClosing das Fenster tatsächlich schließt?

Ich habe anscheinend das umgekehrte Problem für die meisten Menschen. Ich habe den folgenden hübschen Standardcode, um zu sehen, ob der Benutzer einige Speicherungen vornehmen möchte, bevor er das Fenster schließt:

  frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
  frame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent ev) {
      boolean close = true;
         // check some files, asking if the user wants to save
         // YES and NO handle OK, but if the user hits Cancel on any file,
         //   I want to abort the close process     
         // So if any of them hit Cancel, I set "close" to false
      if (close) {
          frame.dispose();
          System.exit(0);
         }
       }            
});

Egal was ich versuche, das Fenster schließt sich immer, wenn ich aus windowClosing komme. Das Ändern von WindowAdapter zu WindowListener macht keinen Unterschied. Was seltsam ist, dass in der Dokumentation explizit steht: "Wenn das Programm das Fenster während der Verarbeitung dieses Ereignisses nicht explizit verbirgt oder freigibt, wird der Vorgang zum Schließen des Fensters abgebrochen." Bei mir funktioniert dies jedoch nicht. Gibt es eine andere Möglichkeit, mit dem x am Rahmen umzugehen? TIA

50
Paul Morrison

Ich habe gerade diesen minimalen Testfall ausprobiert:

import Java.awt.event.WindowAdapter;
import Java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class test {

    public static void main(String[] args) {
        final JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent ev) {
                //frame.dispose();
            }
        });
        frame.setVisible(true);

    }

}

Wenn ich den Dispose-Anruf weiterhin kommentiere und die Schließen-Schaltfläche drücke, wird das Fenster nicht geschlossen. Kommentieren Sie das aus und klicken Sie auf die Schaltfläche "Schließen". Das Fenster wird geschlossen.

Ich muss raten, dass etwas in Ihrer Logik nicht stimmt, um Ihre Variable "close" zu setzen. Versuchen Sie das noch einmal.

67

Dies ist der Schlüssel, den ich denke: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Macht den Unterschied in dem Testfall, den ich erfunden habe.

21
BenCole

nicht sicher, wo ist dein Problem,

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.YES_OPTION) {
                    System.exit(1);
                }
            }
        };
        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.YES_OPTION) {
                System.exit(1);
            }
        }
    }

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

            @Override
            public void run() {
                ClosingFrame cf = new ClosingFrame();
            }
        });
    }
}
7
mKorbel

Für den Umgang mit diesem Ding machen Sie:
Wenn der Benutzer yes auswählt, verwenden Sie setDefaultCloseOperation(DISPOSE_ON_CLOSE); in den geschweiften Klammern dieses if else

wenn ein Abbruch ausgewählt ist, verwenden Sie setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Beispiel betrachten:

int safe = JOptionPane.showConfirmDialog(null, "titleDetails!",  "title!!", JOptionPane.YES_NO_CANCEL_OPTION);

if(safe == JOptionPane.YES_OPTION){
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//yes

} else if (safe == JOptionPane.CANCEL_OPTION) {
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//cancel
} else {
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);//no
}
5
Jibin Mathew

Ich bin mir nicht sicher, wo dein Problem liegt, aber das funktioniert bei mir!

frame.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent evt) {
                            int res=JOptionPane.showConfirmDialog(null,
                                    "Do you want to exit.?");
                            if(res==JOptionPane.YES_OPTION){
                                    Cal.this.dispose();
                            }
            }                               
        });

Um das gleiche Problem zu lösen, habe ich die allererste Antwort dieses Artikels versucht. Als separate Anwendung funktioniert es, in meinem Fall aber nicht. Möglicherweise besteht ein Unterschied zwischen JFrame (in der Antwort) und FrameView (in meinem Fall).

public class MyApp extends SingleFrameApplication { // application class of my project
  ...
  protected static MyView mainForm; // main form of application
  ... 
}  
public class MyView extends FrameView {
    ...
    //Adding this listener solves the problem. 
    MyApp.getInstance().addExitListener(new ExitListener() {

      @Override
      public boolean canExit(EventObject event) {
        boolean res = false;
        int reply = JOptionPane.showConfirmDialog(null,
                "Are You sure?", "", JOptionPane.YES_NO_OPTION);
        if (reply == JOptionPane.YES_OPTION) {
          res = true;
        }
        return res;
      }
      @Override
      public void willExit(EventObject event) {
      }
    });
    ...
}   
1
user3463820

die Methode setDefaultCloseOperation () hilft bei dem Problem .https://chortle.ccsu.edu/Java5/Notes/chap56/ch56_9.html

diesen Link anzeigen

0
user6195279