Swing (библиотека): различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Gipoza (обсуждение | вклад) м уточнение стаба |
Нет описания правки |
||
(не показано 40 промежуточных версий 32 участников) | |||
Строка 1: | Строка 1: | ||
{{другие значения|Свинг}} |
{{другие значения|Свинг}} |
||
{{стиль}} |
|||
[[Файл:Gui-widgets.png|thumb|right|Пример Swing-интерфейса для [[X Window System]] |
[[Файл:Gui-widgets.png|thumb|right|Пример Swing-интерфейса для [[X Window System]]]] |
||
'''Swing''' — [[Библиотека (программирование)|библиотека]] для создания [[Графический интерфейс пользователя|графического интерфейса]] |
'''Swing''' — [[Библиотека (программирование)|библиотека]] для создания [[Графический интерфейс пользователя|графического интерфейса]] программ на языке [[Java]]. Разработана компанией [[Sun Microsystems]]. Она содержит ряд графических [[Элемент интерфейса|компонентов]] ({{lang-en|Swing widgets}}), таких, как поля ввода, [[Таблица|таблицы]] и т. д. |
||
Swing относится к |
Swing относится к классу [[Java Foundation Classes|JFC]], который представляет собой набор библиотек для разработки [[Среда рабочего стола|графических оболочек]]. Поддерживаются [[Java 2D]], [[Accessibility-API]], |
||
[[Drag-and-drop|Drag & Drop]]-API и [[Abstract Window Toolkit|AWT]]. |
|||
== История == |
== История == |
||
Начиная с версии Java 1.2 |
Начиная с версии Java 1.2 1998 года, Swing включён в [[Java Runtime Environment]]. |
||
== Архитектура == |
== Архитектура == |
||
; Look and Feel |
; Look and Feel |
||
[[Архитектура программного обеспечения|Архитектура]] Swing |
[[Архитектура программного обеспечения|Архитектура]] 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 > Creating a GUI With JFC/Swing > Modifying the Look and Feel)</ref>: |
||
⚫ | |||
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 > Creating a GUI With JFC/Swing > Modifying the Look and Feel)</ref>: |
|||
⚫ | * ''SystemLookAndFeel'' — является родным для системы, на которой запущено приложение. Системный L&F определяется во время выполнения. Например, для Windows он имитирует особенности в зависимости от версии ОС. Для [[Linux]] и [[Solaris]] используется [[GTK]], если установлена версия 2.2 и выше, в иных случаях — [[Motif]]. |
||
⚫ | |||
⚫ | * ''SystemLookAndFeel'' — |
||
* ''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 повторяют интерфейс исполняемой [[Компьютерная платформа|платформы]] без изменений. |
|||
⚫ | |||
Компоненты Swing поддерживают специфические динамически |
Компоненты Swing поддерживают специфические динамически {{нп5|Look and feel|подключаемые виды и поведения||}} ({{lang-en|plugable look-and-feel}}), благодаря которому возможна адаптация к графическому интерфейсу платформы (то есть к компоненту можно динамически подключить другой, специфический для операционной системы, в том числе и созданный программистом вид и поведение). Таким образом, приложения, использующие Swing, могут выглядеть как родные приложения для данной операционной системы. Основным минусом таких «легковесных» ({{lang-en|Lightweight}}) компонентов является относительно медленная работа. Положительная сторона — универсальность интерфейса созданных приложений на всех платформах. |
||
=== Принцип Lightweight === |
=== Принцип Lightweight === |
||
«Lightweight» означает, что компоненты Swing |
«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); |
||
} |
} |
||
⚫ | |||
} |
|||
⚫ | |||
Смена вида интерфейса с помощью 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]] |
|||
== Ссылки == |
== Ссылки == |
||
* [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}} |
||
Строка 134: | Строка 133: | ||
|автор = Иван Портянкин |
|автор = Иван Портянкин |
||
|заглавие = Swing: Эффектные пользовательские интерфейсы, 2-е издание |
|заглавие = Swing: Эффектные пользовательские интерфейсы, 2-е издание |
||
|оригинал = |
|||
|оригинал = Swing: Эффектные пользовательские интерфейсы, 2-е издание |
|||
|ссылка = http://www.ipsoftware.ru/ |
|ссылка = http://www.ipsoftware.ru/books/swing_book_2 |
||
|издание = 2-е |
|издание = 2-е |
||
|место = Санкт-Петербург |
|место = Санкт-Петербург |
||
|издательство = [[Лори (издательство)|«Лори»]] |
|издательство = [[Лори (издательство)|«Лори»]] |
||
|год = 2011 |
|год = 2011 |
||
| |
|страниц = 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 |
||
|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]] |
|||
[[bn:সুইং (জাভা)]] |
|||
[[ca:Swing (Java)]] |
|||
[[cs:Swing (Java)]] |
|||
[[de:Swing (Java)]] |
|||
[[en:Swing (Java)]] |
|||
[[es:Swing (biblioteca gráfica)]] |
|||
[[fi:Swing (Java)]] |
|||
[[fr:Swing (Java)]] |
|||
[[it:Swing (Java)]] |
|||
[[ja:Swing]] |
|||
[[ka:Swing]] |
|||
[[ko:스윙 (자바)]] |
|||
[[lt:Swing]] |
|||
[[my:ဆွင်း (ဂျာဗား)]] |
|||
[[nl:Swing (Java)]] |
|||
[[pl:Swing (Java)]] |
|||
[[pt:Swing (Java)]] |
|||
[[uk:Swing (Java)]] |
|||
[[zh:Swing (Java)]] |
Версия от 18:36, 10 сентября 2024
Стиль этой статьи неэнциклопедичен или нарушает нормы литературного русского языка. |
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
}
См. также
Ссылки
- Введение в 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 Архивная копия от 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.