Swing (библиотека)

Из Википедии, бесплатной энциклопедии

Пример Swing-интерфейса для X Window System

Swing — библиотека для создания графического интерфейса программ на языке Java. Разработана компанией Sun Microsystems. Она содержит ряд графических компонентов (англ. Swing widgets), таких как кнопки, поля ввода, таблицы и т. д.

Swing относится к классу JFC, который представляет собой набор библиотек для разработки графических оболочек. Поддерживаются Java 2D, Accessibility-API, Drag & Drop-API и AWT.

История[править | править код]

Начиная с версии Java 1.2 1998 года, Swing включён в Java Runtime Environment.

Архитектура[править | править код]

Look and Feel

Архитектура Swing позволяет корректировать look and feel[en] (L&F) вашего приложения. Look определяет внешний вид компонентов, а «Feel» — их поведение. Sun’s JRE предоставляет следующие L&F[1]:

  • CrossPlatformLookAndFeel — это родной L&F для Java-приложений (также называется Metal). Он используется по умолчанию. Обеспечивается стандартный внешний вид компонентов и поведение, вне зависимости от платформы, на которой запускается приложение.
  • SystemLookAndFeel — является родным для системы, на которой запущено приложение. Системный L&F определяется во время выполнения. Например, для Windows он имитирует особенности в зависимости от версии ОС. Для Linux и Solaris используется GTK, если установлена версия 2.2 и выше, в иных случаях — Motif.
  • Synth — основа для создания собственных L&F.
  • Multiplexing — предоставляет возможность использования различных L&F одновременно.

Сравнение с AWT[править | править код]

Swing предоставляет собой более гибкие интерфейс компоненты, чем библиотека AWT. Компоненты Swing созданы для одинаковой кроссплатформенной работы. AWT, в свою очередь, повторяет интерфейс исполняемой платформы, используя стандартные элементы ОС для отображения. То есть, для каждого элемента создается отдельный объект ОС (окно), из-за чего AWT не позволяет создавать элементы произвольной формы (возможно только использование прямоугольных компонентов), элементы управления на основе библиотеки всегда отображаются поверх Swing-элементов (так как все Swing-компоненты отображаются на поверхности контейнера).

Компоненты Swing поддерживают специфические динамически подключаемые виды и поведения[en] (англ. 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     } 

См. также[править | править код]

Ссылки[править | править код]

Примечания[править | править код]

  1. 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.