Открыть сервисСервис

Swing — библиотека графического интерфейса Java

Swing — набор библиотек графического интерфейса (GUI), входящий в стандартную поставку языка программирования Java. Swing предоставляет компоненты для создания оконных приложений: кнопки, текстовые поля, таблицы, деревья, меню и диалоговые окна. В отличие от предшественника AWT, компоненты Swing реализованы на чистом Java без привязки к нативным виджетам операционной системы, что обеспечивает кроссплатформенность и расширяемость оформления.

История

Swing появился в 1997 году как часть проекта Java Foundation Classes (JFC), разработанного компанией Sun Microsystems. Первая публичная бета-версия была выпущена в 1997 году, стабильная версия вошла в состав JDK 1.2 в декабре 1998 года. Разработка велась под руководством команды, связанной с Netscape, — компонент Swing частично основан на библиотеке Java基础 Classes, созданной для браузера Navigator.

До появления Swing графический интерфейс в Java строился на AWT (Abstract Window Toolkit), компоненты которого были обёртками над нативными виджетами операционной системы. Это приводило к различиям в поведении и внешнеме виде приложений на разных платформах. Swing устранил эту проблему, реализовав все компоненты средствами Java с использованием графического контекста Java 2D.

Архитектура

Swing построен поверх AWT, используя его для создания окна и обработки базовых событий, но полностью переопределяет отрисовку компонентов. Ключевые архитектурные принципы:

  • Отсутствие тяжёлых компонентов (heavyweight). Все виджеты Swing — lightweight-компоненты, отрисовываемые в пределах родительского окна. Это позволяет свободно комбинировать компоненты и избегает проблем с z-порядком.
  • Model-View-Controller (MVC). Компоненты разделены на модель данных, представление и контроллер. Например, JTable отделена от модели TableModel, JTree — от TreeModel.
  • Делегирование отрисовки (Pluggable Look and Feel). Внешний вид отделён от логики. Стандартные реализации: Metal (кроссплатформенный по умолчанию), Nimbus (на основе синтеза), а также нативные темы — Windows, GTK, Motif.

Основные компоненты

КомпонентНазначение
JFrameГлавное окно приложения
JPanelКонтейнер для группировки компонентов
JButtonКнопка
JTextField, JTextAreaВвод текста
JLabelОтображение текста или изображения
JTableТабличные данные
JTreeИерархические данные
JListСписок элементов
JMenuBar, JMenuСистема меню
JDialogДиалоговые окна
JScrollPaneПрокрутка содержимого

Модель потоков

В Swing все операции с компонентами интерфейса должны выполняться в одном потоке — потоке диспетчеризации событий (Event Dispatch Thread, EDT). Фоновые задачи выполняются в отдельных потоках, а результат передаётся в EDT через SwingUtilities.invokeLater(). Нарушение этого правила приводит к неконкурентной модификации компонентов и непредсказуемому поведению интерфейса.

Пример кода

```java import javax.swing.*;

public class HelloSwing { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("Пример"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JButton("Нажми меня")); frame.setSize(300, 200); frame.setVisible(true); }); } } ```

Применение и альтернативы

Swing исторически использовался для настольных Java-приложений: IDE (NetBeans, IntelliJ IDEA в ранних версиях), инструменты администрирования, научное ПО. В 2000-е годы его вытеснила JavaFX, позиционировавшаяся Sun Microsystems как преемник Swing для Rich Internet Applications. Однако в 2010-е JavaFX постепенно утратила поддержку (Oracle прекратила включение в Oracle JDK после версии 10, поддержка продолжается в OpenJFX).

Среди альтернатив для Java-GUI также упоминаются SWT (Standard Widget Toolkit) от Eclipse Foundation, использующий нативные виджеты, и AWT — низкоуровневый предшественник Swing.

Критика

Основные претензии к Swing: «немативный» внешний вид (компоненты выглядят одинаково на разных ОС, что нарушает принятые на платформе конвенции), производительность отрисовки сложных интерфейсов по сравнению с нативными виджетами, а также сложность создания визуально современных приложений без дополнительных библиотек оформления (например, Substance, FlatLaf). При этом сторонники Swing отмечают гибкость, богатый набор компонентов и полный контроль над отрисовкой.

Источники:

  • Oracle. The Java Tutorials: Creating a GUI With Swing

-.oracle.com — Java Foundation Classes (JFC) overview

  • Ерохин А. «Java 9 для чайников»
  • Baeldung. Swing Tutorial
  • Eclipse SWT documentation
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru