Swing – это библиотека для создания пользовательского интерфейса на Java. Начиная с Java версии 1.1, Swing существует в виде отдельной библиотеки, а в Java 2 – в виде встроенного в стандартный API набора классов. Можно сказать, что в Java 2 Swing перестал быть просто библиотекой и стал своего рода технологией создания интерфейса пользователя на Java. Классы Swing располагаются в пакете javax.swing и его подпакетах.
Современные пользовательские интерфейсы строятся с помощью компонентов (component) или элементов управления (control), в зависимости от операционной системы или среды разработки. Создавая Java, сначала как язык, а в дальнейшем как платформу разработки, компания Sun Microsystems изначально обеспечила его возможностями для создания унифицированного пользовательского интерфейса на основе компонентов. В Java 1.0 для этого служил специальный набор объектов AWT (Abstract Window Toolkit, пакет java.awt). Как сказано в документации, «AWT содержит все классы для создания интерфейсов пользователя, а также для рисования и графики». В дальнейшем библиотека AWT послужила основой для создания Swing.
В концепции AWT интерфейс пользователя строится с помощью компонентов, которые могут быть двух типов:
• обычные компоненты (например, кнопки, списки) – класс Component;
• контейнеры – такие компоненты, которые могут содержать в себе другие компоненты (окна, диалоги, панели) – класс Container.
AWT первой версии (как это обычно бывает с первыми версиями) оказался медленным (из-за системы обработки событий) и вообще не очень удобным из-за небольшого количества компонентов и их ограниченной функциональности. Поэтому неудивительно, что новая версия Java 1.1 внесла серьезные изменения в AWT. В первую очередь это коснулось системы обработки событий. В том виде, в котором она появилась в версии 1.1, она осталась и по сей день, благополучно мигрировав в Swing.
Несмотря на то, что некоторая часть функциональности AWT используется в Swing, они достаточно сильно отличаются друг от друга. В первую очередь это касается принципа организации компонентов и контейнеров. Swing реализует более широкую концепцию контейнеров – по функциональности любой компонент может быть контейнером, хотя на практике далеко не все компоненты используются в этой роли. Также в Swing изменилась объектная модель компонентов – практически каждый компонент (за исключением простейшего JLabel) обладает моделью данных (кое-что об XML-парсерах можно прочитать здесь). В AWT, напротив, все данные, используемые компонентами для отображения, хранятся внутри самих объектов-компонентов. В качестве составных частей AWT и Swing входит в JFC.
Swing обладает некоторыми особенностями, которые делают его чрезвычайно удобным для создания пользовательских интерфейсов. В первую очередь стоит упомянуть большое число компонентов. На сегодняшний день в Swing из JDK версии 1.4 содержится более 30 различных компонентов. Другая особенность, выгодно отличающая Swing от его предшественника AWT – так называемая функциональность Look & Feel, отвечающая за внешнее представление Swing-компонентов. Согласно модели MVC2, основной в Swing, логическая модель данных (модель) и ее физическое отображение (вид) напрямую не зависят друг от друга.
Все компоненты в Swing, за исключением самых простых, вроде JLabel, обладают собственной моделью данных. Также все компоненты обладают своим классом, отвечающим за их визуальное отображение. Все классы, отвечающие за представление, находятся в пакете javax.swing.plaf3. Пакет содержит набор абстрактных классов, задающих основные методы, отвечающие за отображение стандартных компонентов Swing. Кроме абстрактных классов, Swing обеспечивает как минимум один неабстрактный класс Look & Feel, так называемый Metal, который поддерживается всеми версиями JDK. Этот класс предназначен для отображения Swing-компонентов и используется по умолчанию. Обычно в JDK для различных платформ можно добавить классы и для других Look & Feel. Так, к примеру, в JDK для Windows присутствует еще два дополнительных – CDE/Motif и Windows. На основе абстрактных классов, содержащихся в javax.swing.plaf, можно создавать собственные классы для представления компонентов.
Еще одной особенностью Swing является Action – функциональность, обеспечивающая единый интерфейс для получения событий. Данная функциональность используется главным образом при создании меню и ToolBar. События, произошедшие в результате нажатия на кнопку в ToolBar или выбора пункта меню, обрабатываются одинаково. Принцип Action заключается в унифицированном создании специфических событий – действий пользователя, а также в привязке их к элементам управления. Интерфейс Action определяет следующий набор методов:
• addPropertyChangeListener() -добавить обработчик данного действия;
• removePropertyChangeListener() – удалить обработчик данного действия;
• getValue() – получить свойство данного действия по ключу;
• putValue() – установить свойство данного действия;
• isEnabled() – разрешено ли данное действие;
• setEnabled() – разрешить/запретить данное действие.
К предопределенным свойствам действия относятся:
• NAME – название (если данное действие используется для построения пункта меню, это свойство будет отображено в качестве названия опции меню);
• SMALLJCON – пиктограмма, ассоциированная с данным действием (это свойство существенно, главным образом, для ToolBar);
• SHORT_DESCRIPTION – короткое описание, обычно используется для всплывающей подсказки (ToolTip).
Классы JMenuBar, JPopupMenu и JToolBar содержат методы для добавления события, которое будет сгененрировано при нажатии на кнопку в ToolBar или при выборе пункта меню. Таким образом, имея единый набор действий в приложении, из них можно конструировать все меню, обычное и выпадающее, а также выносить часть действий в ToolBar. Кроме того, подобный способ организации позволяет иметь единый обработчик действий – событий от разных источников. Swing-компоненты, будучи потомками класса JComponent, имеют два метода для установки и получения рамки (Border), которая будет окружать компонент при отображении. В пакете javax.swing.border содержится предопределенный набор рамок. На этом краткое знакомство со Swing можно считать законченным, а более подробное описание классов и действий – тема отдельной статьи.
a WordPress rating system