Swing (библиотека): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
(не показано 36 промежуточных версий 28 участников)
Строка 1: Строка 1:
{{другие значения|Свинг}}
{{другие значения|Свинг}}
{{стиль}}


[[Файл:Gui-widgets.png|thumb|right|Пример Swing-интерфейса для [[X Window System]].]]
[[Файл:Gui-widgets.png|thumb|right|Пример Swing-интерфейса для [[X Window System]]]]
'''Swing''' — [[Библиотека (программирование)|библиотека]] для создания [[Графический интерфейс пользователя|графического интерфейса]] для программ на языке [[Java]]. Swing был разработан компанией [[Sun Microsystems]]. Он содержит ряд графических [[Элемент интерфейса|компонентов]] ({{lang-en|Swing widgets}}), таких как кнопки, поля ввода, таблицы и т. д.
'''Swing''' — [[Библиотека (программирование)|библиотека]] для создания [[Графический интерфейс пользователя|графического интерфейса]] программ на языке [[Java]]. Разработана компанией [[Sun Microsystems]]. Она содержит ряд графических [[Элемент интерфейса|компонентов]] ({{lang-en|Swing widgets}}), таких, как поля ввода, [[Таблица|таблицы]] и т. д.


Swing относится к библиотеке классов {{abbr|JFC|Java Foundation Classes|2}}, которая представляет собой набор библиотек для разработки графических оболочек. К этим библиотекам относятся [[Java 2D]], [[Accessibility-API]], [[Drag & Drop]]-API и {{abbr|AWT|Abstract Window Toolkit|2}}.
Swing относится к классу [[Java Foundation Classes|JFC]], который представляет собой набор библиотек для разработки [[Среда рабочего стола|графических оболочек]]. Поддерживаются [[Java 2D]], [[Accessibility-API]],
[[Drag-and-drop|Drag & Drop]]-API и [[Abstract Window Toolkit|AWT]].


== История ==
== История ==
Начиная с версии Java 1.2 ([[1998 год]]) Swing включён в [[Java Runtime Environment]].
Начиная с версии Java 1.2 1998 года, Swing включён в [[Java Runtime Environment]].


== Архитектура ==
== Архитектура ==


; Look and Feel
; Look and Feel
[[Архитектура программного обеспечения|Архитектура]] Swing разработана таким образом, что вы можете изменять «[[look and feel]]» (L&F) вашего приложения. «Look» определяет внешний вид компонентов, а «Feel» — их поведение.
[[Архитектура программного обеспечения|Архитектура]] Swing позволяет корректировать {{нп5|look and feel|||}} (L&F) вашего приложения. Look определяет внешний вид компонентов, а «Feel» — их поведение. Sun’s JRE предоставляет следующие L&F<ref>[http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html How to Set the Look and Feel] {{Wayback|url=http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html |date=20110828092834 }} (The Java™ Tutorials &gt; Creating a GUI With JFC/Swing &gt; Modifying the Look and Feel)</ref>:
* ''CrossPlatformLookAndFeel'' — это родной L&F для Java-приложений (также называется Metal). Он используется по умолчанию. Обеспечивается стандартный внешний вид компонентов и поведение, вне зависимости от платформы, на которой запускается приложение.
Sun’s JRE предоставляет следующие L&F<ref>[http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html How to Set the Look and Feel] (The Java™ Tutorials &gt; Creating a GUI With JFC/Swing &gt; Modifying the Look and Feel)</ref>:
* ''SystemLookAndFeel'' — является родным для системы, на которой запущено приложение. Системный L&F определяется во время выполнения. Например, для Windows он имитирует особенности в зависимости от версии ОС. Для [[Linux]] и [[Solaris]] используется [[GTK]], если установлена версия 2.2 и выше, в иных случаях [[Motif]].
* ''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.
* ''Synth'' — основа для создания собственных L&F.
* ''Multiplexing'' — предоставляет возможность использования различных L&F одновременно.
* ''Multiplexing'' — предоставляет возможность использования различных L&F одновременно.


== Сравнение с AWT ==
== Сравнение с AWT ==
Swing предоставляет собой более гибкие интерфейс компоненты, чем библиотека AWT. Компоненты Swing созданы для одинаковой [[Кроссплатформенность|кроссплатформенной]] работы. AWT, в свою очередь, повторяет интерфейс исполняемой платформы, используя стандартные элементы ОС для отображения. То есть, для каждого элемента создается отдельный объект ОС (окно), из-за чего AWT не позволяет создавать элементы произвольной формы (возможно только использование прямоугольных компонентов), элементы управления на основе библиотеки всегда отображаются поверх Swing-элементов (так как все Swing-компоненты отображаются на поверхности контейнера).
Swing предоставляет более гибкие интерфейсные компоненты, чем более ранняя библиотека {{abbr|AWT|Abstract Window Toolkit|2}}. В отличие от AWT, компоненты Swing разработаны для одинаковой [[Кроссплатформенное программное обеспечение|кросс-платформенной]] работы, в то время как компоненты AWT повторяют интерфейс исполняемой [[Компьютерная платформа|платформы]] без изменений.
AWT же использует только стандартные элементы ОС для отображения, то есть для каждого элемента создается отдельный объект ОС (окно), в связи с чем, AWT не позволяет создавать элементы произвольной формы (возможно использовать только прямоугольные компоненты), элементы управления на основе AWT всегда отображаются поверх Swing-элементов (так как все Swing компоненты отображаются на поверхности контейнера).


Компоненты Swing поддерживают специфические динамически [[Look and Feel|подключаемые виды и поведения]] ({{lang-en|plugable look-and-feel}}), благодаря которому возможна адаптация к графическому интерфейсу платформы (то есть к компоненту можно динамически подключить другой, специфический для операционной системы, в том числе и созданный программистом вид и поведение). Таким образом, приложения, использующие Swing, могут выглядеть как родные приложения для данной операционной системы. Основным минусом таких «легковесных» ({{lang-en|Lightweight}}) компонентов является относительно медленная работа. Положительная сторона — универсальность интерфейса созданных приложений на всех платформах.
Компоненты Swing поддерживают специфические динамически {{нп5|Look and feel|подключаемые виды и поведения||}} ({{lang-en|plugable look-and-feel}}), благодаря которому возможна адаптация к графическому интерфейсу платформы (то есть к компоненту можно динамически подключить другой, специфический для операционной системы, в том числе и созданный программистом вид и поведение). Таким образом, приложения, использующие Swing, могут выглядеть как родные приложения для данной операционной системы. Основным минусом таких «легковесных» ({{lang-en|Lightweight}}) компонентов является относительно медленная работа. Положительная сторона — универсальность интерфейса созданных приложений на всех платформах.


=== Принцип Lightweight ===
=== Принцип Lightweight ===
«Lightweight» означает, что компоненты Swing отрисовываются самими компонентами на поверхности родительского окна, без использования компонентов [[Операционная система|операционной системы]]. В отличие от «Тяжелых» компонентов AWT, в приложении Swing может иметься только одно окно, и все прочие компоненты отрисовываются на ближайшем родителе, имеющем собственное окно (например, на JFrame). В приложении могут сочетаться Swing и AWT элементы, хотя это может порождать некоторые проблемы — в частности, компоненты AWT всегда перекрывают Swing элементы, а также закрывают собой всплывающие меню JPopupMenu и JComboBox. Для предотвращения этого, у этих компонентов имеются методы setLightWeightPopupEnabled(boolean), позволяющие запретить использование «Легковесных» всплывающих элементов. При установке свойства в true (setLightWeightPopupEnabled(true)), AWT элементы не будут перекрывать меню.
«Lightweight» означает, что компоненты Swing обрисовываются самими компонентами на поверхности родительского окна, без использования компонентов [[Операционная система|операционной системы]]. В отличие от «тяжёлых» компонентов AWT, в приложении Swing может иметься только одно окно, и все прочие компоненты обрисовываются на ближайшем родителе, имеющем собственное окно (например, на JFrame). В приложении могут сочетаться Swing- и AWT-элементы, хотя это может порождать некоторые проблемы — в частности, компоненты AWT всегда перекрывают Swing-элементы, а также закрывают собой всплывающие меню JPopupMenu и JComboBox. Для предотвращения этого у этих компонентов имеются методы <code>setLightWeightPopupEnabled(boolean)</code>, позволяющие запретить использование «легковесных» всплывающих элементов. При установке свойства в true (<code>setLightWeightPopupEnabled(true)</code>) AWT-элементы не будут перекрывать меню.


== Сравнение с SWT ==
== Сравнение с SWT ==
{{В планах|дата=2015-07-31}}
{{план}}


== Примеры ==
== Примеры ==
«Hello World» с использованием Swing:
«Hello World» с использованием Swing:
<source lang="java">
<source lang="java">import javax.swing.JFrame;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.SwingUtilities;
Строка 44: Строка 43:
// Swing имеет собственный управляющий поток (т.н. dispatching thread),
// Swing имеет собственный управляющий поток (т.н. dispatching thread),
// который работает параллельно с основным (стартовым, в котором выполняется main())
// который работает параллельно с основным (стартовым, в котором выполняется main())
// потоком. Это означает что если основной поток закончит работу (метод main завершится),
// потоком. Это означает, что если основной поток закончит работу (метод main завершится),
// поток отвечающий за работу Swing-интерфейса может продолжать свою работу.
// поток, отвечающий за работу Swing-интерфейса, может продолжать свою работу.
// И даже если пользователь закрыл все окна, программа продолжит свою работу
// И даже если пользователь закрыл все окна, программа продолжит свою работу
// (до тех пор, пока жив данный поток). Начиная с Java 6, когда все компоненты уничтожены,
// (до тех пор, пока жив данный поток). Начиная с Java 6, когда все компоненты уничтожены,
Строка 63: Строка 62:
// Ранее практиковалось следующее: создавался listener и регистрировался
// Ранее практиковалось следующее: создавался listener и регистрировался
// на экземпляре главного окна, который реагировал на windowClosing()
// на экземпляре главного окна, который реагировал на windowClosing()
// принудительной остановкой виртуальной машины вызовом System.exit()
// принудительной остановкой виртуальной машины вызовом System.exit().
// Теперь же есть более "правильный" способ задав реакцию на закрытие окна.
// Теперь же есть более "правильный" способ задать реакцию на закрытие окна.
// Данный способ уничтожает текущее окно, но не останавливает приложение. Тем
// Данный способ уничтожает текущее окно, но не останавливает приложение. Тем
// самым приложение будет работать пока не будут закрыты все окна.
// самым приложение будет работать, пока не будут закрыты все окна.
f.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
f.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
Строка 79: Строка 78:
// pack() "упаковывает" окно до оптимального размера, рассчитанного на основании размеров
// pack() "упаковывает" окно до оптимального размера, рассчитанного на основании размеров
// всех расположенных в нем компонентов.
// всех расположенных в нём компонентов.
f.pack();
f.pack();
Строка 87: Строка 86:
f.setVisible(true);
f.setVisible(true);
}
}
}</source>
}
</source>


Смена вида интерфейса с помощью Look-And-Feel:
Смена вида интерфейса с помощью Look-And-Feel:
Строка 104: Строка 102:
Использование системного Look-And-Feel:
Использование системного Look-And-Feel:
<source lang="java">
<source lang="java">
//Необходимо помнить, что изменение L&F приложения должно быть выполнено до
// Необходимо помнить, что изменение L&F приложения должно быть выполнено до
//инициализации каких-либо компонентов Swing, иначе они могут быть инициализированы
// инициализации каких-либо компонентов Swing, иначе они могут быть инициализированы
//Java L&F, независимо от того, какой L&F вы запрашивали.
// Java L&F, независимо от того, какой L&F вы запрашивали.
public static void main(String[] args) {
public static void main(String[] args) {
try {
try {
Строка 112: Строка 110:
}
}
catch (Exception e) {
catch (Exception e) {
//Exception handle
// Exception handle
}
}
</source>
</source>


== См. также ==
== См. также ==
* [[AWT]]
* [[Abstract Window Toolkit|AWT]]
* [[SWT]]
* [[Standard Widget Toolkit|SWT]]
* [[JavaFX]]
* [[JavaFX]]


== Ссылки ==
== Ссылки ==
* [http://www.ibm.com/developerworks/ru/edu/j-dw-java-intswing-i.html Введение в Swing] {{ref-ru}}
* [http://www.ibm.com/developerworks/ru/edu/j-dw-java-intswing-i.html Введение в Swing] {{ref-ru}} <sup>[недоступно]</sup>
* [http://docs.oracle.com/javase/6/docs/technotes/guides/swing JDK 6 Swing APIs & Developer Guides — from Oracle Coorp] {{ref-en}}
* [http://docs.oracle.com/javase/6/docs/technotes/guides/swing JDK 6 Swing APIs & Developer Guides — from Oracle Coorp] {{ref-en}}
* [http://docs.oracle.com/javase/tutorial/uiswing/index.html Creating a GUI with JFC/Swing: Examples] {{ref-en}}
* [http://docs.oracle.com/javase/tutorial/uiswing/index.html Creating a GUI with JFC/Swing: Examples] {{ref-en}}
Строка 135: Строка 133:
|автор = Иван Портянкин
|автор = Иван Портянкин
|заглавие = Swing: Эффектные пользовательские интерфейсы, 2-е издание
|заглавие = Swing: Эффектные пользовательские интерфейсы, 2-е издание
|оригинал =
|оригинал = Swing: Эффектные пользовательские интерфейсы, 2-е издание
|ссылка = http://www.ipsoftware.ru/
|ссылка = http://www.ipsoftware.ru/books/swing_book_2
|издание = 2-е
|издание = 2-е
|место = Санкт-Петербург
|место = Санкт-Петербург
|издательство = [[Лори (издательство)|«Лори»]]
|издательство = [[Лори (издательство)|«Лори»]]
|год = 2011
|год = 2011
|страницы = 600
|страниц = 600
|isbn = 978-5-85582-305-9
|isbn = 978-5-85582-305-9
}}
}}
* {{книга
* {{книга
|автор = [[Герберт Шилдт]]
|автор = [[Шилдт, Герберт|Герберт Шилдт]]
|заглавие = SWING: руководство для начинающих
|заглавие = SWING: руководство для начинающих
|оригинал = SWING: A BEGINNER'S GUIDE
|оригинал = SWING: A BEGINNER'S GUIDE
|ссылка =
|ссылка = https://archive.org/details/swingbeginnersgu0000schi
|издание =
|издание =
|место = М.
|место = М.
|издательство = [[Вильямс (издательство)|«Вильямс»]]
|издательство = [[Вильямс (издательство)|«Вильямс»]]
|год = 2007
|год = 2007
|страницы = 704
|страниц = 704
|isbn = 0-07-226314-8
|isbn = 0-07-226314-8
}}
* {{книга
|автор = Иван Портянкин
|заглавие = Swing: Эффектные пользовательские интерфейсы
|оригинал = Swing: Эффектные пользовательские интерфейсы
|ссылка = http://www.ipsoftware.ru/
|издание = 1-е
|место = Санкт-Петербург
|издательство = [[Питер (издательство)|«Питер»]]
|год = 2005
|страницы = 523
|isbn = 5-469-00005-2
}}
}}


{{soft-stub}}
{{Инструментарии виджетов}}
{{Инструментарии виджетов}}


[[Категория:Java]]
[[Категория:Java]]
[[Категория:Библиотеки виджетов]]
[[Категория:Библиотеки виджетов]]

[[ar:جافا (لغة برمجة)#تطبيق Swing]]

Версия от 18:36, 10 сентября 2024

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