Java - Comment puis-je empêcher WindowClosing de fermer la fenêtre

il semble que j'ai le problème inverse pour la plupart des gens. J'ai le code assez standard suivant pour voir si l'utilisateur veut faire quelques sauvegardes avant de fermer la fenêtre:

  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);
         }
       }            
});

peu importe ce que j'essaie, la fenêtre se ferme toujours quand je sors de windowClosing. Changer WindowAdapter en WindowListener ne fait aucune différence. Ce qui est bizarre, c'est que la documentation dit explicitement "si le programme ne cache pas explicitement ou ne dispose pas de la fenêtre pendant le traitement de ceci cas, la fenêtre à proximité de l'opération sera annulée," mais il ne fonctionne pas comme cela pour moi. Est-il une autre façon de gérer le x sur le cadre? TIA

43
demandé sur Harry Johnston 2011-09-30 20:52:54

7 réponses

je viens d'essayer ce cas de test minimal:

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);

    }

}

si je garde l'appel dispose commenté, et que j'appuie sur le bouton fermer, la fenêtre ne sort pas. Décommentez ça et appuyez sur le bouton fermer, la fenêtre se ferme.

je devrai deviner que quelque chose ne va pas dans votre logique pour définir votre variable "proche". Essayez de vérifier.

61
répondu developmentalinsanity 2011-09-30 17:00:18

C'est la clé, il me semble: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); fait la différence dans le cas d'essai que j'ai concocté.

19
répondu BenCole 2011-09-30 17:07:42

Je ne sais pas où est votre problème,

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
répondu mKorbel 2011-09-30 18:38:13

Pour le traitement de cette chose à faire:

si l'utilisateur sélectionne oui, alors utiliser setDefaultCloseOperation(DISPOSE_ON_CLOSE); dans les accolades de cette if else

si une annulation est sélectionné, puis utiliser setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Examiner exemple:

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
}
4
répondu Jibin Mathew 2014-04-04 20:11:44

la méthode setDefaultCloseOperation () aide à résoudre le problème .https://chortle.ccsu.edu/java5/Notes/chap56/ch56_9.html

voir ce lien

1
répondu 2016-04-12 19:50:25

Je ne sais pas où est votre problème, mais cela fonctionne pour moi!

image.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();
                        }
        }                               
    });
0
répondu Tharindu Malawaraarachchi 2015-05-31 05:27:59

Pour résoudre le même problème, j'ai essayé la première réponse de cet article. Comme application séparée cela fonctionne, mais pas dans mon cas. Peut-être que la différence est dans JFrame(en réponse) et FrameView (mon cas).

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) {
      }
    });
    ...
}   
0
répondu user3463820 2015-08-10 12:37:31