Swing — библиотека для создания графического интерфейса программ на языке Java. Разработана компанией Sun Microsystems. Она включает ряд графических компонентов (), таких как поля ввода, таблицы и т.д.
Swing относится к классу JFC, который представляет собой набор библиотек для разработки графических оболочек. Поддерживаются Java 2D, Accessibility API, Drag & Drop-API и AWT.
История Начиная с версии Java от 1 февраля 1998 года, Swing включён в Java Runtime Environment.
Архитектура
Look and Feel Архитектура Swing позволяет настраивать (L&F) вашего приложения. Look определяет внешний вид компонентов, а «Feel» — их поведение. JRE от Sun предоставляет следующие L&FHow to Set the Look and Feel (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel): 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 поддерживают специфические динамически (), благодаря чему возможна адаптация к графическому интерфейсу платформы. Иными словами, для компонента можно динамически задать другой вид и поведение, специфические для операционной системы (в том числе созданные программистом). Таким образом, приложения, использующие Swing, могут выглядеть как родные для данной операционной системы. Основным недостатком таких «легковесных» () компонентов является относительно медленная работа, а положительной стороной – универсальность интерфейса на всех платформах.
Принцип 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
См. также AWT SWT JavaFX
Ссылки Введение в Swing [недоступно] JDK 6 Swing APIs & Developer Guides — from Oracle Coorp Creating a GUI with JFC/Swing: Examples A Swing Architecture Overview Swing Sightings: список приложений на Swing
Примечания
Литература
Категория:Java Категория:Библиотеки виджетов