Выход JFrame на закрытой Java - PullRequest
50 голосов
/ 18 октября 2011

Я не понимаю, как я могу использовать этот код:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

чтобы закрыть программу кнопкой x.

Ответы [ 8 ]

76 голосов
/ 18 октября 2011

Вам нужна строка

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

Поскольку поведение JFrame по умолчанию при нажатии кнопки X эквивалентно

frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

Так что почти все времямне нужно добавить эту строку вручную при создании JFrame

В настоящее время я имею в виду константы в WindowConstants, такие как WindowConstants.EXIT_ON_CLOSE вместо тех же констант, объявленных непосредственно в JFrame, поскольку предыдущие лучше отражают намерения.

6 голосов
/ 18 октября 2011

Если у вас его нет, JFrame просто будет удален.Рамка закроется, но приложение продолжит работу.

4 голосов
/ 18 октября 2011

Вызов setDefaultCloseOperation(EXIT_ON_CLOSE) делает именно это. Это заставляет приложение закрываться, когда приложение получает событие закрытия окна из операционной системы. Нажатие кнопки закрытия (X) в вашем окне приводит к тому, что операционная система генерирует событие закрытия окна и отправляет его в ваше Java-приложение. Событие закрытия окна обрабатывается циклом событий AWT в приложении Java, которое завершает работу приложения в ответ на событие.

Если вы не вызовете этот метод, цикл обработки событий AWT может не выйти из приложения в ответ на событие закрытия окна, а оставить его работающим в фоновом режиме.

3 голосов
/ 31 марта 2015

Я потратил немало времени, изучая Интернет, чтобы найти элегантное решение. Как обычно, я нашел много противоречивой информации.

Я наконец-то закончил:

  1. Не используйте EXIT_ON_CLOSE, так как это может оставить ресурсы позади;
  2. В инициализации JFrame используйте что-то вроде следующего:

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  3. Настоящим открытием стало то, как на самом деле отправить оконное сообщение в JFrame. Например, как часть вашего JMenuItem для выхода из приложения, используйте следующее, где функция getFrame() возвращает ссылку на JFrame:

    public class AppMenuFileExit extends JMenuItem implements ActionListener
    {
        // do your normal menu item code here
    
          @Override
          public void actionPerformed(ActionEvent e)
          {
            WindowEvent we;
            we = new WindowEvent((Window) App.getFrame(), WindowEvent.WINDOW_CLOSING);
    
            App.getFrame().dispatchEvent(we);
          }
    }
    

    JFrame является подклассом Window, поэтому может быть приведен к Window для этой цели.

  4. Кроме того, в вашем классе JFrame есть следующее для обработки оконных сообщений:

    public class AppFrame extends JFrame implements WindowListener
    {
      // Do all the things you need to for the class
    
      @Override
      public void windowOpened(WindowEvent e)
      {}
      @Override
      public void windowClosing(WindowEvent e)
      {/* can do cleanup here if necessary */}
    
      @Override
      public void windowClosed(WindowEvent e)
      {
        dispose();
        System.exit(0);
      }
      @Override
      public void windowActivated(WindowEvent e)
      {}
      @Override
      public void windowDeactivated(WindowEvent e)
      {}    
      @Override
      public void windowDeiconified(WindowEvent e)
      {}
      @Override
      public void windowIconified(WindowEvent e)
      {}
    }
    
1 голос
/ 11 января 2015

Если вы используете Frame (Class Extends Frame), вы не получите

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
0 голосов
/ 21 мая 2019

Если вы не расширяете JFrame и не используете JFrame в переменной, вы можете использовать:

frame.dispose();
System.exit(0);
0 голосов
/ 23 июля 2016

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

это сработало для меня в случае Class Extends Frame

0 голосов
/ 13 декабря 2012

У меня работает следующий код:

System.exit(home.EXIT_ON_CLOSE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...