Введение
Инструментарий GUI на основе Java Swing – это набор виджетов GUI для Java. Он является частью Oracle Java Foundation Classes (JFC) – API для создания графического пользовательского интерфейса (GUI) для программ на Java. Swing был разработан для обеспечения более широкого набора компонентов GUI по сравнению с более ранним Abstract Window Toolkit (AWT). Swing предоставляет внешний вид, имитирующий внешний вид различных платформ, а также поддерживает подключаемые стили оформления, позволяющие приложениям иметь внешний вид, не зависящий от базовой платформы. Он обладает более мощными и гибкими компонентами, чем AWT. Помимо привычных компонентов, таких как кнопки, флажки и метки, Swing предоставляет ряд продвинутых компонентов, таких как панели с вкладками, панели прокрутки, деревья, таблицы и списки. В отличие от компонентов AWT, компоненты Swing не реализованы с использованием платформенно-зависимого кода. Вместо этого они полностью написаны на Java и, следовательно, являются платформенно-независимыми. В декабре 2008 года Sun Microsystems (предшественник Oracle) выпустила фреймворк на основе CSS/FXML, который должен был стать преемником Swing, под названием JavaFX.
Swing is a GUI widget toolkit for Java. It is part of Oracle's Java Foundation Classes (JFC) – an API for providing a graphical user interface (GUI) for Java programs. Swing was developed to provide a more sophisticated set of GUI components than the earlier Abstract Window Toolkit (AWT). Swing provides a look and feel that emulates the look and feel of several platforms, and also supports a pluggable look and feel that allows applications to have a look and feel unrelated to the underlying platform. It has more powerful and flexible components than AWT. In addition to familiar components such as buttons, check boxes and labels, Swing provides several advanced components such as tabbed panel, scroll panes, trees, tables, and lists. Unlike AWT components, Swing components are not implemented by platform specific code. Instead, they are written entirely in Java and therefore are platform independent. In December 2008, Sun Microsystems (Oracle's predecessor) released the CSS / FXML based framework that it intended to be the successor to Swing, called JavaFX.
История
Internet Foundation Classes (IFC) — это графическая библиотека для Java, первоначально разработанная корпорацией Netscape Communications Corporation и впервые выпущенная 16 декабря 1996 года. 2 апреля 1997 года Sun Microsystems и Netscape Communications Corporation объявили о своем намерении объединить IFC с другими технологиями для формирования Java Foundation Classes. «Классы базовых функций Java» позже были переименованы в «Swing». Swing представил механизм, позволяющий изменять внешний вид каждого компонента приложения без внесения существенных изменений в код приложения. Внедрение поддержки подключаемых стилей оформления позволяет компонентам Swing имитировать внешний вид нативных компонентов, сохраняя при этом преимущества платформенной независимости. Первоначально распространявшийся как отдельно загружаемая библиотека, Swing был включен в состав Java Standard Edition, начиная с версии 1.2. Классы и компоненты Swing содержатся в иерархии пакетов. Разработка преемника Swing, JavaFX, началась в 2005 году, и она была официально представлена два года спустя на JavaOne 2007. JavaFX был сделан проектом с открытым исходным кодом в 2011 году, а в 2012 году стал частью загрузки Oracle JDK. JavaFX заменяет Swing благодаря ряду преимуществ, включая меньший вес, поддержку CSS-стилей, современный дизайн элементов управления, а также использование FXML и Scene Builder. В 2018 году JavaFX стал частью OpenJDK в рамках проекта OpenJFX для ускорения темпов его разработки. В команду Java Client, ответственную за Swing, входили Джеймс Гослинг (архитектор), Рик Левенсон (менеджер), Эми Фаулер и Ганс Мюллер (со-технические лидеры), Том Болл, Джефф Динкинс, Джордж Сааб, Тим Принзинг, Джонни Канерва и Джаннет Хунг и Джим Грэм (2D-графика).
Архитектура
Swing — это кроссплатформенный GUI-фреймворк для Java, реализующий архитектуру "модель-представление-контроллер" и основанный на однопоточной модели программирования. Кроме того, этот фреймворк предоставляет уровень абстракции между структурой кода и графическим отображением пользовательского интерфейса, созданного на Swing.
Фундации
Swing является платформенно-независимым, поскольку полностью написан на Java. Полную документацию по всем классам Swing можно найти в Java API Guide для версии 6 или в спецификации Java Platform Standard Edition 8 API для версии 8.
Расширяемая
Swing — это высокомодульная архитектура, позволяющая подключать различные пользовательские реализации указанных интерфейсов фреймворка. Пользователи могут предоставлять свои собственные реализации этих компонентов для переопределения стандартных, используя механизм наследования Java. Swing — это фреймворк, основанный на компонентах, все из которых в конечном итоге происходят от класса `JComponent`. Объекты Swing асинхронно генерируют события, имеют связанные свойства и реагируют на документированный набор методов, специфичных для каждого компонента. Компоненты Swing являются компонентами JavaBeans и соответствуют спецификации JavaBeans.
Swing is a component based framework, whose components are all ultimately derived from the class. Swing objects asynchronously fire events, have bound properties, and respond to a documented set of methods specific to the component. Swing components are JavaBeans components, compliant with the JavaBeans specification.
Конфигурируемый
Сильная зависимость Swing от механизмов времени выполнения и косвенных моделей композиции позволяет ему динамически реагировать на фундаментальные изменения в настройках. Например, приложение, разработанное на Swing, может "на лету" заменять свой пользовательский интерфейс. Более того, пользователи могут предоставить собственную реализацию оформления, что позволяет единообразно изменять внешний вид существующих приложений Swing без внесения каких-либо изменений в код приложения.
Легкий UI
Высокий уровень гибкости Swing проявляется в его внутренней способности переопределять элементы управления графическим интерфейсом (GUI) родной операционной системы (OS) для своего отображения. Swing "рисует" свои элементы управления, используя API Java 2D, а не вызывая нативный инструментарий пользовательского интерфейса. Таким образом, у компонента Swing нет соответствующего компонента GUI операционной системы, и он может свободно отображаться любым способом, который позволяет базовая графическая подсистема. Однако, в основе своей, каждый компонент Swing опирается на контейнер AWT, поскольку Swing расширяет контейнер AWT. Это позволяет Swing интегрироваться с системой управления GUI операционной системы, включая критически важные соответствия устройств/экранов и взаимодействие с пользователем, такие как нажатия клавиш или движения мыши. Swing просто "накладывает" свою собственную (независимую от ОС) семантику на базовые (зависимые от ОС) компоненты. Например, каждый компонент Swing отрисовывает свое представление на графическом устройстве в ответ на вызов метода `component.paint()`, который определен в (AWT) Container. Но, в отличие от компонентов AWT, которые делегировали отрисовку своим нативным "тяжеловесным" виджетам операционной системы, компоненты Swing сами отвечают за свою отрисовку. Эта трансформация и разделение касаются не только визуальной составляющей, но и управления и применения Swing собственной семантикой, независимой от ОС, для событий, возникающих в иерархии контейнеров компонентов. В общем, архитектура Swing делегирует задачу сопоставления различных вариантов семантики GUI операционной системы с простым, но обобщенным шаблоном контейнеру AWT. На основе этой обобщенной платформы Swing устанавливает свою собственную богатую и сложную семантику GUI в форме модели.
Лёгко сцепленные и MVC
Библиотека Swing активно использует шаблон проектирования программного обеспечения "модель-представление-контроллер" (MVC), который концептуально отделяет данные, отображаемые пользователю, от элементов управления пользовательского интерфейса, через которые осуществляется просмотр. Благодаря этому большинство компонентов Swing имеют связанные модели (определенные в терминах интерфейсов Java), и программисты могут использовать различные реализации по умолчанию или предоставлять свои собственные. Фреймворк предоставляет реализации интерфейсов моделей по умолчанию для всех своих конкретных компонентов. Типичное использование фреймворка Swing не требует создания пользовательских моделей, поскольку он предоставляет набор реализаций по умолчанию, которые прозрачно, по умолчанию, связаны с соответствующим дочерним классом в библиотеке Swing. Как правило, только сложные компоненты, такие как таблицы, деревья и иногда списки, могут потребовать реализации пользовательской модели для работы со специфичными для приложения структурами данных. Чтобы лучше понять потенциал архитектуры Swing, рассмотрим гипотетическую ситуацию, когда пользовательские модели для таблиц и списков являются обертками над сервисами DAO и/или EJB. Обычно объекты модели компонентов Swing отвечают за предоставление лаконичного интерфейса, определяющего генерируемые события и доступные свойства для (концептуальной) модели данных, используемые связанным JComponent. Учитывая, что общая модель MVC представляет собой шаблон слабосвязанных совместных отношений между объектами, модель предоставляет программные средства для присоединения слушателей событий к объекту модели данных. Как правило, эти события ориентированы на модель (например, событие "вставлена строка" в табличной модели) и преобразуются специализацией JComponent в значимое событие для компонента GUI. Например, таблица имеет модель с именем `TableModel`, которая описывает интерфейс для доступа к табличным данным. Реализация по умолчанию работает с двумерным массивом. Компонент "представления" (view) Swing JComponent – это объект, используемый для графического представления концептуального элемента управления GUI. Особенностью Swing как GUI-фреймворка является его зависимость от программно отрисовываемых элементов управления GUI (в отличие от использования элементов управления GUI родной операционной системы). До обновления Java 6 Update 10 это различие было источником проблем при смешивании элементов управления AWT, использующих родные элементы управления, с элементами управления Swing в GUI (см. Смешивание компонентов AWT и Swing). Наконец, с точки зрения визуальной композиции и управления, Swing предпочитает относительные макеты (определяющие позиционные взаимосвязи между компонентами) абсолютным макетам (определяющим точное местоположение и размер компонентов). Эта склонность к "гибкому" визуальному упорядочению обусловлена его происхождением из среды выполнения апплетов, которая сформировала проектирование и разработку оригинального набора инструментов Java GUI. (Концептуально, этот подход к управлению макетом весьма схож с тем, который используется при отрисовке HTML-контента в браузерах, и решает тот же набор задач, которые мотивировали последний.)
Отношения к AWT
С ранних версий Java часть Abstract Window Toolkit (AWT) предоставляла платформенно-независимые API для компонентов пользовательского интерфейса. В AWT каждый компонент отрисовывается и управляется нативным компонентом-парником, специфичным для базовой оконной системы. В отличие от этого, компоненты Swing часто описываются как легковесные, поскольку им не требуется выделение нативных ресурсов в оконном наборе инструментов операционной системы. Компоненты AWT называются тяжеловесными компонентами. Большая часть API Swing, как правило, является дополнительным расширением AWT, а не прямой заменой. Фактически, каждый легковесный интерфейс Swing в конечном итоге существует внутри тяжеловесного компонента AWT, поскольку все компоненты верхнего уровня в Swing (, , , и ) расширяют контейнер верхнего уровня AWT. До выхода Java 6 Update 10 использование как легковесных, так и тяжеловесных компонентов в одном окне обычно не рекомендовалось из-за несовместимости порядка наложения (Z-порядка). Однако в более поздних версиях Java эти проблемы были устранены, и теперь компоненты Swing и AWT можно использовать в одном графическом интерфейсе без проблем с порядком наложения. Основная функциональность отрисовки, используемая Swing для рисования своих легковесных компонентов, предоставляется Java 2D, еще одной частью JFC.
Отношения к SWT
Standard Widget Toolkit (SWT) — это конкурирующий инструментарий, первоначально разработанный IBM и в настоящее время поддерживаемый сообществом Eclipse. Реализация SWT имеет больше общего с тяжеловесными компонентами AWT. Это обеспечивает такие преимущества, как более высокая точность соответствия базовому нативному набору инструментов для работы с окнами, но за счет большей зависимости от нативной платформы в модели программирования. Велись активные дискуссии и высказывались предположения о производительности SWT по сравнению со Swing: некоторые полагали, что сильная зависимость SWT от JNI замедлит обмен данными между компонентом GUI и Java, но ускорит рендеринг после загрузки модели данных в GUI, однако это не было подтверждено. Достаточно обширный набор тестов, проведенный в 2005 году, показал, что ни Swing, ни SWT не демонстрируют явного превосходства друг над другом в общем случае.