Подтвердить что ты не робот

Выход JFrame на закрытии Java

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

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

чтобы закрыть программу с помощью кнопки x.

4b9b3361

Ответ 1

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

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Наконец я закончил:

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

    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    
  • Реальное открытие состояло в том, как на самом деле отправлять сообщение окна в 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, поэтому для этой цели может быть применено к окну.

  • И в классе JFrame необходимо обработать сообщения Window:

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

Ответ 5

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

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)

Ответ 6

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

System.exit(home.EXIT_ON_CLOSE);

Ответ 7

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

это сработало для меня в случае расширения класса.

Ответ 8

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

frame.dispose();
System.exit(0);