web-dev-qa-db-fra.com

Java - comment puis-je empêcher WindowClosing de fermer réellement la fenêtre

Je semble avoir 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 lorsque je sors de la fenêtre. Changer WindowAdapter en WindowListener ne fait aucune différence. Ce qui est bizarre, c'est que la documentation dit explicitement: "Si le programme ne masque ou ne supprime pas explicitement la fenêtre pendant le traitement de cet événement, l'opération de fermeture de fenêtre sera annulée", mais cela ne fonctionne pas de cette façon pour moi. Existe-t-il une autre manière de gérer le x sur le cadre? TIA

50
Paul Morrison

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 commenté l'appel de suppression et que je clique sur le bouton Fermer, la fenêtre ne se ferme pas. Décommentez cela et appuyez sur le bouton Fermer, la fenêtre se ferme.

Je devrais deviner que quelque chose ne va pas dans votre logique pour définir votre variable "close". Essayez de vérifier cela.

67

C'est la clé, il me semble: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Fait la différence dans le cas de test que j'ai préparé.

21
BenCole

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
mKorbel

Pour la manipulation de cette chose:
si l'utilisateur sélectionne oui alors utilisez setDefaultCloseOperation(DISPOSE_ON_CLOSE); entre les accolades de ce if else

si une annulation est sélectionnée, utilisez setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Prenons l'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
}
5
Jibin Mathew

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

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

Pour résoudre le même problème, j'ai essayé la toute première réponse de cet article. En tant qu'application distincte, 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) {
      }
    });
    ...
}   
1
user3463820

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

voir ce lien

0
user6195279