Гид по технологиям

Первое Java GUI: руководство по Swing

5 min read Java Обновлено 05 Jan 2026
Первое Java GUI: руководство по Swing
Первое Java GUI: руководство по Swing

Изображение: разработчик пишет Java GUI приложение на компьютере

Введение

Java предоставляет набор классов JFC (Java Foundation Classes) для создания графических интерфейсов. JFC — кроссплатформенный, он включает поддержку смены внешнего вида (look-and-feel), интернационализации и набор Swing‑компонентов. В этом руководстве внимание сосредоточено на Swing — самой распространённой библиотеке для настольных GUI в классическом Java.

Важно: Swing — «легковесная» библиотека компонентов, совместимая с большинством JVM и ОС. Если вам нужна аппаратно-ускоренная графика или современный UI, рассмотрите JavaFX.

Компоненты Swing

Swing — пакет JFC с набором лёгковесных GUI‑компонентов. Полезные пакеты, с которыми вы чаще всего столкнётесь:

  • javax.swing — основной набор компонентов (JFrame, JButton, JLabel и т. д.).
  • javax.swing.event — события и слушатели Swing.

Все визуальные элементы в Swing образуют иерархию контейнеров (containment hierarchy). Корнем этой иерархии является топ‑уровневый контейнер.

Топ‑уровневые контейнеры

Swing предоставляет три основных топ‑уровневых класса:

  • JFrame — главное окно (рамка) приложения.
  • JDialog — диалоговые окна.
  • JApplet — контейнер для апплетов (устаревший в современных приложениях).

Каждый топ‑уровневый контейнер обычно включает content pane (панель содержимого) и опционально меню‑бар. Content pane — это область, в которую вы добавляете видимые компоненты. Меню‑бар содержит список пунктов меню для вашего окна.

Основной пример: создание фрейма

Класс JFrame используется для создания основного окна. Простейшая строка для создания фрейма:

JFrame frame = new JFrame("My Title");

Конструктор позволяет задать заголовок окна. Но одного экземпляра недостаточно — нужно сделать окно видимым и задать размеры и поведение при закрытии.

Оригинальный минимальный пример из документации:

import javax.swing.*;  
  
class gui{  
    public static void main(String args[]){  
  
      JFrame frame = new JFrame("HelloWorld");  
      frame.setVisible(true);  
  
   }  
}  

Важно: такой фрейм может появиться в неожиданном месте экрана и программа будет продолжать работать после закрытия окна, поскольку поведение по умолчанию лишь скрывает окно.

Чтобы окно имело размер и корректно завершало программу при закрытии, используйте setSize() и setDefaultCloseOperation():

import javax.swing.*;  
  
class gui{  
  
   public static void main(String args[]){  
  
      JFrame frame = new JFrame("HelloWorld");  
  
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
      frame.setSize(400,400);     
      frame.setVisible(true);  
  
   }  
}

Альтернативный и рекомендуемый способ — запуск на EDT

Swing не потокобезопасен; создание и обновление UI должны выполняться в потоке диспетчеризации событий (EDT). Рекомендуемый шаблон:

import javax.swing.*;

public class GuiApp {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("HelloWorld");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 400);
            frame.setLocationRelativeTo(null); // центрировать
            frame.setVisible(true);
        });
    }
}

Пояснение: SwingUtilities.invokeLater гарантирует, что создание и отображение компонентов произойдёт в EDT.

Варианты поведения при закрытии окна

  • HIDE_ON_CLOSE — скрывает окно (по умолчанию). Программа продолжает работать.
  • DO_NOTHING_ON_CLOSE — при попытке закрыть окно никакого действия не выполняется; обработка должна быть реализована через WindowListener и метод windowClosing().
  • DISPOSE_ON_CLOSE — скрывает окно и освобождает ресурсы, связанные с ним.
  • EXIT_ON_CLOSE — завершает приложение (обычно используется для главного окна).

Выбор зависит от жизненного цикла приложения (однопоточное приложение, множественные окна, фоновые задачи).

Разметка и менеджеры компоновки

В Swing визуальные компоненты располагаются с помощью layout managers: BorderLayout, FlowLayout, GridLayout, BoxLayout и др. Простейший пример добавления кнопки:

JButton btn = new JButton("Нажми меня");
frame.getContentPane().add(btn, BorderLayout.CENTER);

Совет: используйте менеджеры компоновки вместо абсолютных координат — так интерфейс будет адаптироваться к разным размерам окон и локализации.

Обработка событий

Swing использует модель слушателей (listeners). Пример для JButton:

btn.addActionListener(e -> System.out.println("Кнопка нажата"));

Важно: любые длительные операции нужно выносить из EDT (например, в SwingWorker), иначе интерфейс будет «заморожен».

Когда Swing не подходит (контрпримеры)

  • Вам нужен современный аппаратно-ускоренный интерфейс с CSS‑подобной стилизацией — рассмотрите JavaFX.
  • Планируется тесная интеграция с нативными виджетами и системными темами — SWT бывает удобнее, но менее переносим.
  • Проект — веб‑приложение, мобильное приложение или облачный сервис — требуется другой стэк (HTML5/React/Angular, Android/iOS).

Альтернативные подходы

  • JavaFX — современная замена Swing, поддерживает FXML, CSS и WebView.
  • AWT — старый набор компонентов, теперь используется редко.
  • SWT — нативные виджеты (Eclipse), требует бандлинга платформенных библиотек.
  • Для скриптовых прототипов: Python + Tkinter (легко начать), PyQt или Kivy для более сложных решений.

Краткий пример перехода на Python/Tkinter

Если вы хотите быстро прототипировать GUI и не требовать Java‑инфраструктуры, Tkinter даёт простой API и небольшой объём кода. Пример на Python:

import tkinter as tk

root = tk.Tk()
root.title("HelloWorld")
root.geometry("400x400")

btn = tk.Button(root, text="Нажми меня", command=lambda: print("Кнопка нажата"))
btn.pack(expand=True)

root.mainloop()

Примечание: переход с Java на Python хорош для быстрых прототипов, но Python не заменит JVM‑экосистему, если требуется интеграция с существующими Java‑библиотеками.

Чеклист по разработке Java Swing‑приложения

Для разработчика:

  • Создание GUI в EDT (SwingUtilities.invokeLater).
  • Установить setDefaultCloseOperation в соответствии с требованием.
  • Использовать менеджеры компоновки, избегать абсолютных позиций.
  • Вынести длительные задачи из EDT (SwingWorker, фоновые потоки).
  • Центрировать окно (setLocationRelativeTo(null)).

Для тестировщика:

  • Проверить поведение при закрытии окна (все режимы).
  • Тесты на локализацию (переводы и перенос строк).
  • Проверить адаптивность интерфейса при разных размерах окна.

Для дизайнера:

  • Убедиться в согласованности look-and-feel.
  • Предоставить набор иконок и размеров для HiDPI.

Модель принятия решения (Mermaid)

flowchart TD
  A[Нужен GUI?] -->|Да| B{Требуется аппаратное ускорение?}
  B -->|Да| C[JavaFX]
  B -->|Нет| D{Нужна нативность?}
  D -->|Да| E[SWT]
  D -->|Нет| F[Swing]
  A -->|Нет| G[Использовать веб/CLI]

Мини‑методология быстрой разработки (5 шагов)

  1. Определите требования к жизненному циклу окна и поведению при закрытии.
  2. Выберите тулкит (Swing/JavaFX/SWT) на основе требований к внешнему виду и интеграции.
  3. Проектируйте интерфейс с менеджерами компоновки и поддержкой локализации.
  4. Создавайте и обновляйте UI в EDT; выносите тяжёлые задачи в фоны.
  5. Покрывайте тестами сценарии открытия/закрытия, масштабирования и локализации.

Небольшой глоссарий

  • EDT — Event Dispatch Thread, поток Swing для выполнения GUI‑операций.
  • Content pane — панель содержимого топ‑уровневого контейнера.
  • Look-and-feel — внешний вид и поведение визуальных компонентов.

Безопасность и ресурсы

Важно освобождать ресурсы: используйте DISPOSE_ON_CLOSE для окон, которые нужно удалить, и правильно закрывайте потоки и внешние соединения при завершении приложения.

Краткое резюме

Swing остаётся надёжным, переносимым и простым для небольших настольных приложений на Java. Для современного UI и аппаратного ускорения подумайте о JavaFX. Всегда создавайте GUI в EDT, используйте менеджеры компоновки и не храните тяжёлые операции в потоке интерфейса.

Важно: начинайте с малого — прототипируйте интерфейс и только затем дорабатывайте архитектуру и обработку фоновых задач.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство