Java - как я могу предотвратить WindowClosing от фактического закрытия окна - PullRequest
50 голосов
/ 30 сентября 2011

У меня, кажется, есть обратная проблема для большинства людей. У меня есть следующий довольно стандартный код, чтобы увидеть, хочет ли пользователь сделать некоторые сохранения перед закрытием окна:

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

Независимо от того, что я пытаюсь, окно всегда закрывается, когда я выхожу из окна. Закрытие. Изменение WindowAdapter на WindowListener не имеет никакого значения. Что странно, так это то, что в документации явно сказано: «Если программа не скрывает или не скрывает окно во время обработки этого события, операция закрытия окна будет отменена», но у меня это не работает Есть ли другой способ обработки х на кадре? ТИА

Ответы [ 7 ]

67 голосов
/ 30 сентября 2011

Я только что попробовал этот минимальный тестовый пример:

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

    }

}

Если я оставлю комментарий на вызов dispose и нажму кнопку закрытия, окно не закроется.Раскомментируйте это и нажмите кнопку закрытия, окно закроется.

Я должен был бы догадаться, что в вашей логике что-то не так, чтобы установить переменную «закрыть».Попробуйте дважды это проверить.

21 голосов
/ 30 сентября 2011

Это ключ, метинкс: frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); Разница в тесте, который я приготовил.

7 голосов
/ 30 сентября 2011

не уверен, где твоя проблема,

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();
            }
        });
    }
}
5 голосов
/ 04 апреля 2014

Для обработки этой вещи сделайте:
если пользователь выбирает да, тогда используйте setDefaultCloseOperation(DISPOSE_ON_CLOSE); в фигурных скобках этого if else

если выбрана отмена, используйте setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

Рассмотрим пример:

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
}
1 голос
/ 10 августа 2015

Чтобы решить ту же проблему, я попробовал самый первый ответ этой статьи.Как отдельное приложение это работает, но не в моем случае.Может быть, разница в JFrame (в ответе) и FrameView (в моем случае).

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 голос
/ 31 мая 2015

Не уверен, где ваша проблема, но это работает для меня!

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();
                            }
            }                               
        });
0 голосов
/ 12 апреля 2016

Метод setDefaultCloseOperation () помогает в проблеме. https://chortle.ccsu.edu/java5/Notes/chap56/ch56_9.html

просмотреть эту ссылку

...