Swing | это... Что такое Swing? (original) (raw)
У этого термина существуют и другие значения, см. Свинг.
Swing — библиотека для создания графического интерфейса для программ на языке Java. Swing был разработан компанией Sun Microsystems. Он содержит ряд графических компонентов (англ. Swing widgets), таких как кнопки, поля ввода, таблицы и т. д.
Swing относится к библиотеке классов JFC, которая представляет собой набор библиотек для разработки графических оболочек. К этим библиотекам относятся Java 2D, Accessibility-API, Drag & Drop-API и AWT.
Содержание
- 1 История
- 2 Архитектура
- 3 Сравнение с AWT
- 4 Сравнение с SWT
- 5 Примеры
- 6 См. также
- 7 Ссылки
- 8 Примечания
- 9 Литература
История
Начиная с версии Java 1.2 (1998 год) Swing включён в Java Runtime Environment.
Архитектура
Look and Feel
Архитектура Swing разработана таким образом, что вы можете изменять «look and feel» (L&F) вашего приложения. «Look» определяет внешний вид компонентов, а «Feel» — их поведение. Sun’s JRE предоставляет следующие L&F[1]:
- CrossPlatformLookAndFeel — это родной L&F для Java-приложений (так же называется Metal). Он используется по умолчанию, обеспечивая стандартное поведение компонентов и их внешний вид, вне зависимости от платформы, на которой запускается приложение.
- SystemLookAndFeel — в этом случае приложение использует L&F, который является родным для системы, на которой запущено приложение. Системный L&F определяется во время выполнения. Для Windows используется «Windows» L&F, который имитирует особенности конкретной системы, на которой запущен — классический Windows, XP, или Vista. Для Linux и Solaris используется «GTK+», если установлен GTK+ 2.2 или более поздняя версия, в противном случае используется «Motif».
- Synth — основа для создания собственных L&F.
- Multiplexing — предоставляет возможность использования различных L&F одновременно.
Сравнение с AWT
Swing предоставляет более гибкие интерфейсные компоненты, чем более ранняя библиотека AWT. В отличие от AWT, компоненты Swing разработаны для одинаковой кросс-платформенной работы, в то время как компоненты AWT повторяют интерфейс исполняемой платформы без изменений. 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
Примеры
«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
Ссылки
- Введение в 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 (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
Литература
- Иван Портянкин Swing: Эффектные пользовательские интерфейсы, 2-е издание = Swing: Эффектные пользовательские интерфейсы, 2-е издание. — 2-е. — Санкт-Петербург: «Лори», 2011. — С. 600. — ISBN 978-5-85582-305-9
- Герберт Шилдт SWING: руководство для начинающих = SWING: A BEGINNER'S GUIDE. — М.: «Вильямс», 2007. — С. 704. — ISBN 0-07-226314-8
- Иван Портянкин Swing: Эффектные пользовательские интерфейсы = Swing: Эффектные пользовательские интерфейсы. — 1-е. — Санкт-Петербург: «Питер», 2005. — С. 523. — ISBN 5-469-00005-2
Инструменты разработки элементов графического интерфейса | |
---|---|
Низко-уровневые | Macintosh Toolbox/Carbon • Windows API • Intrinsics • Intuition • Xlib |
Высоко-уровневые | Amiga OS BOOPSI • Magic User Interface • Zune • ReAction GUI Mac OS и Mac OS X Cocoa • MacApp • MacZoop • PowerPlant Microsoft Windows Microsoft Foundation Classes • Windows Template Library • SmartWin++ • Object Windows Library • Visual Component Library • Windows Forms • Windows Presentation Foundation UNIX, под X Xaw • Motif • LessTif • InterViews Кросс-платфор-менные На основе Flash ASWing • Adobe Flex • Gnash • SWF2EXE Software На основе XML,AJAX или SVG Ample SDK • CougarXML • Dojo Toolkit • Echo • ExtJS • GladeXML • Google Web Toolkit • jQuery • Lively Kernel • MooTools • Pyjamas • qooxdoo • Rialto Toolkit • script.aculo.us • XML User Interface • XUL • Yahoo! UI Library На основе Java Abstract Window Toolkit • Swing • Standard Widget Toolkit • Qt Jambi На основеC или C++ Agar • CEGUI • Component Library for Cross Platform • dlib C++ Library • FLTK • FOX toolkit • OpenGL User Interface Library • GTK+ • IUP • Juce • JX Application Framework • Qt • TnFOX • Visual Component Framework • wxWidgets • YAAF • XForms • XVT • Ultimate++ На основе Common Lisp CAPI • Common Graphics • CLIM • McCLIM • Garnet На основе Pascal IP Pascal • Lazarus • fpGUI • FireMonkey На основе Python Pyjamas • PyQt • PyGTK • PyGUI • wxPython • PySide • Tkinter На основе Objective C GNUstep На основе других Tk |