Swing (библиотека) — Википедия

Swing — библиотека для создания графического интерфейса программ на языке Java. Разработана компанией Sun Microsystems. Она включает ряд графических компонентов (англ. Swing Widgets), таких как поля ввода, таблицы и т.д.
Swing относится к классу JFC, который представляет собой набор библиотек для разработки графических оболочек. Поддерживаются Java 2D, Accessibility API, Drag & Drop-API и AWT.
История
[править | править код]Начиная с версии Java от 1 февраля 1998 года, Swing включён в Java Runtime Environment.
Архитектура
[править | править код]- Look and Feel
Архитектура Swing позволяет настраивать look and feel[англ.] (L&F) вашего приложения. Look определяет внешний вид компонентов, а «Feel» — их поведение. JRE от Sun предоставляет следующие L&F[1]:
- CrossPlatformLookAndFeel — родной L&F для Java-приложений, используемый по умолчанию, который обеспечивает стандартный внешний вид компонентов и их поведение независимо от платформы.
- SystemLookAndFeel — родной L&F для операционной системы, на которой запущено приложение. Системный L&F определяется во время выполнения. Например, для Windows он имитирует особенности, характерные для конкретной версии ОС. Для Linux и Solaris используется GTK, если установлена версия 2.2 и выше; в иных случаях — Motif.
- Synth — основа для создания собственных L&F.
- Multiplexing — предоставляет возможность использования различных L&F одновременно.
Сравнение с AWT
[править | править код]Swing предоставляет более гибкие интерфейсные компоненты, чем библиотека AWT. Компоненты Swing разработаны для обеспечения кроссплатформенной работы, в отличие от AWT, которая повторяет интерфейс операционной системы, используя стандартные элементы ОС для отображения. Это означает, что для каждого элемента создаётся отдельный объект ОС (окно), из-за чего AWT не позволяет создавать компоненты произвольной формы (возможно использование только прямоугольных компонентов), а элементы управления на основе AWT всегда отображаются поверх компонентов Swing (так как все Swing-компоненты выводятся на поверхность контейнера).
Компоненты Swing поддерживают специфические динамически подключаемые виды и поведения[англ.] (англ. plugable look-and-feel), благодаря чему возможна адаптация к графическому интерфейсу платформы. Иными словами, для компонента можно динамически задать другой вид и поведение, специфические для операционной системы (в том числе созданные программистом). Таким образом, приложения, использующие Swing, могут выглядеть как родные для данной операционной системы. Основным недостатком таких «легковесных» (англ. Lightweight) компонентов является относительно медленная работа, а положительной стороной – универсальность интерфейса на всех платформах.
Принцип Lightweight
[править | править код]«Lightweight» означает, что компоненты Swing отрисовываются непосредственно на поверхности родительского окна, без использования компонентов операционной системы. В отличие от «тяжёлых» компонентов AWT, в приложении Swing может быть только одно окно, а все остальные компоненты отрисовываются на ближайшем родительском элементе, обладающем собственным окном (например, на JFrame). В приложении могут сочетаться элементы Swing и AWT, хотя это может порождать некоторые проблемы – в частности, компоненты AWT всегда перекрывают Swing-элементы и могут закрывать всплывающие меню JPopupMenu и JComboBox. Для предотвращения этого у данных компонентов предусмотрены методы setLightWeightPopupEnabled(boolean)
, позволяющие отключить использование «легковесных» всплывающих элементов. При установке свойства в true (setLightWeightPopupEnabled(true)
) AWT-элементы не будут перекрывать меню.
Сравнение с SWT
[править | править код]Swing и SWT представляют два принципиально различных подхода к созданию графического интерфейса в Java. Swing реализован полностью на Java и использует легковесные компоненты, что обеспечивает кроссплатформенность и единообразный внешний вид независимо от операционной системы. В отличие от него, SWT опирается на нативные компоненты ОС, что позволяет приложениям, построенным с его помощью, выглядеть и работать как родные для конкретной платформы.
Использование нативных компонентов в SWT обеспечивает более высокую производительность, лучшую интеграцию с системой и доступ к специфичным для ОС функциям, однако внешний вид и поведение элементов могут варьироваться в зависимости от платформы. Swing, напротив, гарантирует стабильное отображение интерфейса благодаря своей независимости от платформы, хотя его легковесная архитектура может уступать SWT в скорости отклика и интеграции с нативными особенностями ОС.
Кроме того, Swing поддерживает динамически подключаемые виды и поведения[англ.], что позволяет адаптировать внешний вид компонентов к особенностям конкретной платформы, т.е. менять L&F и т.д.
Примеры
[править | править код]«Hello, World» с использованием Swing:
import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; public final class HelloWorld implements Runnable { public static void main(String[] args) { // Swing имеет собственный управляющий поток (т.н. dispatching thread), // который работает параллельно с основным (стартовым, в котором выполняется main()) // потоком. Это означает, что если основной поток закончит работу (метод main завершится), // поток, отвечающий за работу Swing-интерфейса, может продолжать свою работу. // И даже если пользователь закрыл все окна, программа продолжит свою работу // (до тех пор, пока жив данный поток). Начиная с Java 6, когда все компоненты уничтожены, // управляющим интерфейсом поток останавливается автоматически. // // Запускаем весь код, работающий с интерфейсом, в управляющем потоке, даже инициализацию: SwingUtilities.invokeLater (new HelloWorld()); } public void run() { // Создаем окно с заголовком "Hello, World!" JFrame f = new JFrame ("Hello, World!"); // Ранее практиковалось следующее: создавался listener и регистрировался // на экземпляре главного окна, который реагировал на windowClosing() // принудительной остановкой виртуальной машины вызовом System.exit(). // Теперь же есть более "правильный" способ задать реакцию на закрытие окна. // Данный способ уничтожает текущее окно, но не останавливает приложение. Тем // самым приложение будет работать, пока не будут закрыты все окна. f.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); // однако можно задать и так: // f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); // Добавляем на панель окна нередактируемый компонент с текстом. //f.getContentPane().add (new JLabel("Hello, World!")); - старый стиль f.add(new JLabel("Hello World")); // pack() "упаковывает" окно до оптимального размера, рассчитанного на основании размеров // всех расположенных в нём компонентов. f.pack(); // Показать окно f.setVisible(true); } }
Смена вида интерфейса с помощью Look-And-Feel:
try { UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); } catch (Exception e){ System.out.println("Ошибка при загрузке Metal-Look-And-Feel"); }
Использование системного Look-And-Feel:
// Необходимо помнить, что изменение L&F приложения должно быть выполнено до // инициализации каких-либо компонентов Swing, иначе они могут быть инициализированы // Java L&F, независимо от того, какой L&F вы запрашивали. public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { // Exception handle }
См. также
[править | править код]Ссылки
[править | править код]- Введение в Swing (рус.) [недоступно]
- JDK 6 Swing APIs & Developer Guides — from Oracle Coorp (англ.)
- Creating a GUI with JFC/Swing: Examples (англ.)
- A Swing Architecture Overview (англ.)
- Swing Sightings: список приложений на Swing (англ.)
Примечания
[править | править код]- ↑ How to Set the Look and Feel Архивная копия от 28 августа 2011 на Wayback Machine (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
Литература
[править | править код]- Иван Портянкин. Swing: Эффектные пользовательские интерфейсы, 2-е издание. — 2-е. — Санкт-Петербург: «Лори», 2011. — 600 с. — ISBN 978-5-85582-305-9.
- Герберт Шилдт. SWING: руководство для начинающих = SWING: A BEGINNER'S GUIDE. — М.: «Вильямс», 2007. — 704 с. — ISBN 0-07-226314-8.