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

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

5 min read Java GUI Обновлено 19 Dec 2025
Первое Java GUI: окно со Swing
Первое Java GUI: окно со Swing

Написание Java GUI — пример окна приложения на рабочем столе

Введение в 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

  1. Создайте каркас в EDT (invokeLater).
  2. Добавьте основной JFrame с набором менеджеров компоновки.
  3. Заполните content pane базовыми контролами (кнопки, метки, поля ввода).
  4. Вызовите pack() или setSize(), затем setVisible(true).
  5. Обработайте закрытие (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.

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

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

Evernote для заметок о встречах — полный гид
Продуктивность

Evernote для заметок о встречах — полный гид

Как стать модератором Reddit — пошаговое руководство
Руководства

Как стать модератором Reddit — пошаговое руководство

Как приглушить пользователя в Facebook
Социальные сети

Как приглушить пользователя в Facebook

Как посмотреть и улучшить Tesla Safety Score
Электромобили

Как посмотреть и улучшить Tesla Safety Score

Превратите привычки в пожертвования
Благотворительность

Превратите привычки в пожертвования

Как правильно закрепить телевизор на стене
Дом и ремонт

Как правильно закрепить телевизор на стене