Я не понимаю, как использовать этот код:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
чтобы закрыть программу с помощью кнопки x.
Я не понимаю, как использовать этот код:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
чтобы закрыть программу с помощью кнопки x.
Вам нужна строка
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Поскольку поведение по умолчанию для JFrame при нажатии кнопки X эквивалентно
frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
Поэтому почти все время, которое вам нужно будет добавить эту строку вручную при создании JFrame
В настоящее время я ссылаюсь на константы в WindowConstants
как WindowConstants.EXIT_ON_CLOSE
вместо тех же констант, объявленных непосредственно в JFrame
, поскольку предыдущие лучше отражают намерение.
Если у вас его нет, JFrame будет просто удален. Рамка закроется, но приложение продолжит работу.
Вызов setDefaultCloseOperation(EXIT_ON_CLOSE)
делает именно это. Это заставляет приложение выйти, когда приложение получает событие закрытия окна из операционной системы. Нажатие кнопки закрытия (X) в вашем окне заставляет операционную систему генерировать событие закрытого окна и отправлять его в ваше приложение Java. Событие закрытия окна обрабатывается циклом событий AWT в вашем приложении Java, которое выйдет из приложения в ответ на событие.
Если вы не вызываете этот метод, цикл событий AWT может не выходить из приложения в ответ на событие закрытия окна, но оставить его в фоновом режиме.
Я потратил немало времени на проработку через интернет для элегантного решения этого. Как обычно, я нашел много противоречивой информации.
Наконец я закончил:
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)
{}
}
Если вы используете Frame (Class Extends Frame), вы не получите
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
Следующий код работает для меня:
System.exit(home.EXIT_ON_CLOSE);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
это сработало для меня в случае расширения класса.
Если вы не расширяете JFrame
и не используете сам JFrame
в переменной, вы можете использовать:
frame.dispose();
System.exit(0);