- Swing (Java)
-
Swing — библиотека для создания графического интерфейса на языке Sun Microsystems. Он содержит ряд графических компонентов (англ. Swing widgets), таких как кнопки, поля ввода, таблицы и т. д.
Swing относится к библиотеке классов JFC, которая представляет собой набор библиотек для разработки графических оболочек. К этим библиотекам относятся Java 2D, Accessibility-API, Drag & Drop-API и AWT.
Swing предоставляет более гибкие интерфейсные компоненты, чем более ранняя библиотека AWT. В отличие от AWT, компоненты Swing разработаны для одинаковой кросс-платформенной работы, в то время как компоненты AWT повторяют интерфейс исполняемой платформы без изменений. Компоненты 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 элементы не будут перекрывать меню.
История
Начиная с версии Java 1.2 (1998 год) Swing включён в Java Runtime Environment.
Архитектура
Look and Feel
Сравнение с AWT
В отличие от Swing, AWT использует только стандартные элементы ОС для отображения, т.е. для каждого элемента создается отдельный объект ОС (окно), в связи с чем, AWT не позволяет создавать элементы произвольной формы (возможно использовать только прямоугольные компоненты), элементы управления на основе AWT всегда отображаются поверх Swing-элементов (т.к. все Swing компоненты отображаются на поверхности контейнера).
Сравнение с 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!")); // 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"); }
См. также
-
Ссылки
Литература
- Герберт Шилдт SWING: руководство для начинающих = SWING: A BEGINNER'S GUIDE. — М.: «Вильямс», 2007. — С. 704. — ISBN 0-07-226314-8
- Иван Портянкин Swing: Эффектные пользовательские интерфейсы = Swing: Эффектные пользовательские интерфейсы. — 1-ое. — Санкт-Петербург: «Питер», 2005. — С. 523. — ISBN 5-469-00005-2
-
Wikimedia Foundation. 2010.