Каждое десктопное приложение должно иметь окно. В этом окне будут располагаться все необходимые компоненты графического интерфейса пользователя, посредством которых пользователь будет работать с приложением. Попробуем создать окно нашего приложения и разместить там что-нибудь. Пока что наше приложение будет простым и незамысловатым. Для создания окна приложения в Swing используется класс JFrame. Он содержит ряд методов и свойств, которые позволяют настроить его должным образом. Рассмотрим пример.
import javax.swing.JFrame;
import javax.swing.JLabel;
public class TestFrame <
public static void createGUI() <
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame(«Test frame»);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel(«Test label»);
frame.getContentPane().add(label);
frame.setPreferredSize(new Dimension(200, 100));
public static void main(String[] args) <
javax.swing.SwingUtilities.invokeLater(new Runnable() <
public void run() <
createGUI();
>
>);
>
>

Это самое простое Swing приложение. Данный код создаст приложение, внешний вид которого представлен на рисунке. Рассмотрим код более детально. Каждое приложение должно содержать статический метод main – точка входа приложения, именно с него начинается выполнение.
Далее выполняется создание графического интерфейса пользователя. Создание графического интерфейса пользователя непременно должно происходить в Event dispatch потоке. Для этого метод вызывается внутри определенного вида конструкции SwingUtilities. Перейдем к непосредственному созданию и размещению компонентов.
Самой первой строкой метода createGUI мы говорим системе, чтобы окно полностью рисовалось Swing. Если закомментировать этот код, то окно будет определяться самой операционной системой – Swing доверит рисовать окно ей. Далее создаем само окно и указываем текст, который будет располагаться в его заголовке. С помощью метода setDefaultCloseOperation мы говорим системе, как отреагировать на закрытие окна. Сейчас нам необходимо, чтобы при закрытии окна закрывалось и приложение. Для этого мы передаем параметр JFrame.EXIT_ON_CLOSE. Но когда-нибудь необходимо будет не закрывать приложение, а закрыть только окно и оставить выполняться его в фоновом режиме, тогда мы будем передавать этому методу другой параметр.
Далее создаем текстовый лейбл с помощью JLabel, указывая при этом какой текст мы хотим в нем видеть, и размещаем на форме. При размещении компонента в окне тоже есть одна хитрость. У объекта JFrame есть специальная панель content pane, на которой должны размещаться все остальные дочерние компоненты. С помощью вызова getContentPane мы получаем эту панель и добавляем лейбл уже на нее. Далее устанавливаем размер окна и показываем его пользователю.
Иногда история создания интернета интересна к прочтению. Можно много узнать о том, как создавали интернет.
I don’t get how can I employ this code:
to close the program with the x button.
8 Answers 8
You need the line
Because the default behaviour for the JFrame when you press the X button is the equivalent to
So almost all the times you’ll need to add that line manually when creating your JFrame
I am currently referring to constants in WindowConstants like WindowConstants.EXIT_ON_CLOSE instead of the same constants declared directly in JFrame as the prior reflect better the intent.
If you don’t have it, the JFrame will just be disposed. The frame will close, but the app will continue to run.
Calling setDefaultCloseOperation(EXIT_ON_CLOSE) does exactly this. It causes the application to exit when the application receives a close window event from the operating system. Pressing the close (X) button on your window causes the operating system to generate a close window event and send it to your Java application. The close window event is processed by the AWT event loop in your Java application which will exit the application in response to the event.
If you do not call this method the AWT event loop may not exit the application in response to the close window event but leave it running in the background.
I spent quite a bit of time spelunking through the internet for an elegant solution to this. As is usually the case, I found a lot of conflicting information.
I finally ended with:
-
Do not use EXIT_ON_CLOSE as this can leave resources behind;
Do use something like the following in the JFrame initialization:
The real discovery was how to actually dispatch a window message to the JFrame. As an example, as part of your JMenuItem for exiting the application, use the following, where the function getFrame() returns a reference to the JFrame:
JFrame is a subclass of Window so may be cast to Window for this purpose.
And, have the following in your JFrame class to handle Window messages:
Какой правильный способ закрыть JFrame , как если бы пользователь нажал кнопку закрытия X или нажал Alt + F4 (в Windows)?
У меня есть операция закрытия по умолчанию, установленная так, как я хочу, через:
Он делает именно то, что я хочу, с вышеупомянутыми элементами управления. Этот вопрос не об этом.
То, что я действительно хочу сделать, — это заставить графический интерфейс вести себя так же, как нажатие кнопки закрытия X приведет к его поведению.
Предположим, что я должен расширить WindowAdaptor , а затем добавить экземпляр моего адаптера в качестве слушателя через addWindowListener() . Я хотел бы видеть ту же последовательность вызовов через windowDeactivated() , windowClosing() и windowClosed() , что и при нажатии кнопки закрытия X . Не так много разрывает окно, как говорится, чтобы оно так рвало.
Если вы хотите, чтобы графический интерфейс работал так, как будто вы нажали кнопку закрытия X , вам нужно отправить событие закрытия окна в Window . ExitAction из Закрытие приложения позволяет вам добавить эту функциональность в элемент меню или любой компонент, который легко использует Action .
Не слишком сложно.
Если по Alt-F4 или X вы имеете в виду «Немедленно выйти из приложения без учета того, для чего работают другие Windows или потоки», то System.exit(. ) будет делать именно то, что вы хотите, в очень резкой, грубой силе и, возможно, проблематичным способом.
Если по Alt-F4 или X вы хотите скрыть окно, тогда frame.setVisible(false) — это то, как вы «закрываете» окно. Окно будет продолжать потреблять ресурсы/память, но может быть сделано видимым снова очень быстро.
Если по Alt-F4 или X вы хотите скрыть окно и избавиться от любых ресурсов, которые он потребляет, тогда frame.dispose() — это то, как вы «закрываете» окно. Если кадр был последним видимым окном, и нет других потоков не-daemon, программа завершит работу. Если вы снова откроете окно, ему придется снова инициализировать все собственные ресурсы (графический буфер, дескрипторы окон и т.д.).
dispose() может быть ближе всего к поведению, которое вы действительно хотите. Если в вашем приложении открыто несколько окон, вы хотите, чтобы Alt-F4 или X покинули приложение или просто закрыли активное окно?