Как создать первое Java GUI‑приложение со Swing

Введение в Swing и JFC
Java предоставляет набор классов JFC (Java Foundation Classes) для создания графических интерфейсов. JFC — часть платформы Java, поэтому интерфейсы, созданные с их помощью, кросс‑платформенные.
Swing — это пакет JFC с «лёгкими» GUI‑компонентами. Главные пакеты, которые вам понадобятся чаще всего: javax.swing и javax.swing.event. Компоненты Swing поддерживают настраиваемый вид (look-and-feel), интернационализацию и богатые элементы управления.
Определение: топ‑уровневый контейнер — компонент, корень деревa видимых компонентов (например, главное окно приложения).
Важно: все видимые компоненты должны находиться в иерархии содержимого (containment hierarchy): дерево компонентов, корнем которого является топ‑уровневый контейнер.
Топ‑уровневые контейнеры
Swing предоставляет три основных класса для топ‑уровневых контейнеров:
- JFrame — главное окно/фрейм приложения.
- JDialog — диалоговые окна.
- JApplet — контейнер для applet (устаревший в современных средах).
В этой статье мы сосредоточимся на использовании JFrame. Обычно каждый топ‑уровневый контейнер содержит content pane (панель содержимого) и, при необходимости, строку меню.
Создание простого окна (Frame)
Фрейм — это главное окно приложения. Он обычно имеет заголовок и границы. Для создания используйте класс JFrame:
JFrame frame = new JFrame("My Title");Конструктор позволяет задать заголовок окна. Но одной только инстанциации недостаточно: нужно показать окно и задать поведение при закрытии.
Простейший рабочий пример:
import javax.swing.*;
public class SimpleGui {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorld");
frame.setVisible(true);
}
}Запустив этот код, вы, возможно, увидите крошечное окно на краю экрана и заметите, что приложение не завершается при закрытии этого окна. По умолчанию закрытие скрывает окно, но процесс Java остаётся запущенным.
Размер окна и поведение при закрытии
Чтобы окно имело удобный размер и чтобы приложение корректно завершалось при закрытии окна, используйте методы setSize() и setDefaultCloseOperation():
import javax.swing.*;
public class SimpleGui {
public static void main(String[] args) {
JFrame frame = new JFrame("HelloWorld");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
frame.setVisible(true);
}
}Пояснения:
- EXIT_ON_CLOSE — завершает программу при закрытии окна.
- HIDE_ON_CLOSE — операция по умолчанию; скрывает окно, но приложение остаётся (окно всё ещё displayable).
- DO_NOTHING_ON_CLOSE — при запросе закрытия ничего не происходит; закрытие можно обработать через WindowListener и его метод windowClosing().
- DISPOSE_ON_CLOSE — скрывает окно и освобождает ресурсы, связанные с ним.
Совет: в реальных приложениях часто используют DISPOSE_ON_CLOSE для вспомогательных окон и EXIT_ON_CLOSE для главного окна при однопроцессной архитектуре.
Размещение компонентов и панель содержимого
Content pane — это область, куда вы помещаете видимые компоненты. До Java 5 практиковали вызов frame.getContentPane().add(…). Современный и более читаемый подход — вызывать add(…) напрямую на JFrame (внутренне это делегирует в content pane):
JButton button = new JButton("Нажми меня");
frame.add(button); // добавляет на content paneПо умолчанию у content pane установлен BorderLayout. Для более точного управления используйте менеджеры компоновки (LayoutManager):
- FlowLayout — простой потоковый расклад.
- BorderLayout — пять областей (NORTH, SOUTH, EAST, WEST, CENTER).
- GridLayout — сетка одинаковых ячеек.
- BoxLayout — вертикальный/горизонтальный стек.
Выбор менеджера компоновки — ключ к адаптивному интерфейсу.
Частые ошибки и почему окно не видно
- Не вызвали setVisible(true).
- Забыли задать размер или pack(). pack() подгоняет окно под предпочтительные размеры компонентов.
- Создаёте и изменяете Swing‑компоненты не в Event Dispatch Thread (EDT). Следуйте правилу: создавать и изменять GUI нужно в EDT. Пример правильного запуска:
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("EDT example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.setVisible(true);
});Важно: если вы вызываете длительные задачи, выносите их в фоновые потоки (SwingWorker), чтобы не блокировать UI.
Краткие советы по отладке
- Включите pack() перед setVisible(true), если компоненты имеют собственные предпочтительные размеры.
- Используйте frame.setLocationRelativeTo(null) чтобы центрировать окно на экране.
- Если окно мелькает на краю экрана — проверьте setLocation и менеджер компоновки.
Когда Swing не лучший выбор (контрпримеры)
- Вам нужен современный богатый UI с аппаратным ускорением и анимациями — рассмотрите JavaFX.
- Требуется нативный вид под каждую ОС и доступ к новым компонентам — возможно, лучше делать отдельные нативные приложения.
- Если команда предпочитает быстрый прототип на Python/JavaScript — используйте другие инструменты.
Альтернативные подходы
- JavaFX — современная замена Swing для новых GUI‑проекта. Он поддерживает CSS‑стилизацию, сцены (Scene/Stage) и богатую графику.
- SWT (Eclipse) — компоновка с нативными виджетами, хороша для интеграции с платформой.
- Веб‑интерфейс (Electron, браузерная UI) — вариант для кросс‑платформенных приложений с веб‑стеком.
Мини‑пример JavaFX (схематично):
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;
public class FxApp extends Application {
@Override
public void start(Stage stage) {
stage.setScene(new Scene(new Label("Hello JavaFX"), 300, 200));
stage.show();
}
}Быстрая альтернатива: первое GUI на Python с Tkinter
Если вам нужно написать простое окно быстро и с меньшим объёмом кода, рассмотрите Python и библиотеку Tkinter. Пример:
import tkinter as tk
root = tk.Tk()
root.title("Hello from Tkinter")
root.geometry('300x200')
label = tk.Label(root, text='Привет, мир!')
label.pack(pady=20)
root.mainloop()Python полезен для прототипирования интерфейсов. Но в корпоративных Java‑проектах чаще выбирают Swing или JavaFX.
Роль‑ориентированный чеклист перед запуском GUI‑приложения
- Разработчик:
- Убедиться, что инициализация GUI происходит в EDT (SwingUtilities.invokeLater).
- Использовать менеджеры компоновки, а не абсолютные размеры.
- Выносить длительные операции в фоновые потоки.
- QA:
- Проверить поведение при закрытии окна (EXIT/DISPOSE).
- Проверить перевод интерфейса (локализация).
- Проверить масштабирование (DPI) и размеры на разных экранах.
- DevOps:
- Проверить JRE/JDK версии и совместимость look-and-feel.
Мини‑методология: как быстро сделать минимальный GUI
- Создайте каркас в EDT (invokeLater).
- Добавьте основной JFrame с набором менеджеров компоновки.
- Заполните content pane базовыми контролами (кнопки, метки, поля ввода).
- Вызовите pack() или setSize(), затем setVisible(true).
- Обработайте закрытие (DISPOSE/EXIT) и фоновые задачи (SwingWorker).
1‑строчная глоссарий
- EDT — Event Dispatch Thread, главный поток для обработки событий и обновления Swing UI.
- pack() — подгоняет размер окна под предпочтительные размеры вложенных компонентов.
Итог (резюме)
Swing остаётся рабочим и простым инструментом для создания классических настольных интерфейсов на Java. Для простого окна достаточно создать JFrame, задать размер (или вызвать pack()), определить поведение при закрытии и показать окно в EDT. Для современных интерфейсов рассмотрите JavaFX. Для быстрого прототипирования — Tkinter в Python.
Важно: всегда работайте с GUI в Event Dispatch Thread и не выполняйте долгие задачи в UI‑потоке.
Важно: если вы поддерживаете существующий Swing‑код, используйте проверенные паттерны: разделение логики и интерфейса, менеджеры компоновки, и обработку фоновых задач через SwingWorker.
Критерии приёмки:
- Приложение открывает главное окно с заданным заголовком.
- Окно корректно отображает компоненты и не блокирует UI при фоновых задачах.
- При закрытии главное окно завершает приложение или освобождает ресурсы в соответствии с требованием.
Список литературы и следующего шага: изучите JavaFX для современного UI и практикуйтесь с менеджерами компоновки в Swing.
Похожие материалы
Evernote для заметок о встречах — полный гид
Как стать модератором Reddit — пошаговое руководство
Как приглушить пользователя в Facebook
Как посмотреть и улучшить Tesla Safety Score
Превратите привычки в пожертвования