WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте
Пример Swing-интерфейса для X Window System.

Swing — библиотека для создания графического интерфейса для программ на языке Java. Swing был разработан компанией 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, который является родным для системы, на которой запущено приложение. Системный 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 поддерживают специфические динамически подключаемые виды и поведения[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 (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)

Литература

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии