Swing

Поделись знанием:
Перейти к: навигация, поиск

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

Ссылки

  • [www.ibm.com/developerworks/ru/edu/j-dw-java-intswing-i.html Введение в Swing]  (рус.)
  • [docs.oracle.com/javase/6/docs/technotes/guides/swing JDK 6 Swing APIs & Developer Guides — from Oracle Coorp]  (англ.)
  • [docs.oracle.com/javase/tutorial/uiswing/index.html Creating a GUI with JFC/Swing: Examples]  (англ.)
  • [java.sun.com/products/jfc/tsc/articles/architecture/ A Swing Architecture Overview]  (англ.)
  • [java.sun.com/products/jfc/tsc/sightings/index.html Swing Sightings: список приложений на Swing]  (англ.)

Примечания

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

Литература

  • Иван Портянкин. [www.ipsoftware.ru/ Swing: Эффектные пользовательские интерфейсы, 2-е издание] = Swing: Эффектные пользовательские интерфейсы, 2-е издание. — 2-е. — Санкт-Петербург: «Лори», 2011. — С. 600. — ISBN 978-5-85582-305-9.
  • Герберт Шилдт. SWING: руководство для начинающих = SWING: A BEGINNER'S GUIDE. — М.: «Вильямс», 2007. — С. 704. — ISBN 0-07-226314-8.
  • Иван Портянкин. [www.ipsoftware.ru/ Swing: Эффектные пользовательские интерфейсы] = Swing: Эффектные пользовательские интерфейсы. — 1-е. — Санкт-Петербург: «Питер», 2005. — С. 523. — ISBN 5-469-00005-2.

Отрывок, характеризующий Swing

Это значило, что Тихон подавал ему не тот жилет, который он хотел. Другой раз он остановился, спросил:
– И скоро она родит? – и, с упреком покачав головой, сказал: – Нехорошо! Продолжай, продолжай.
В третий раз, когда князь Андрей оканчивал описание, старик запел фальшивым и старческим голосом: «Malbroug s'en va t en guerre. Dieu sait guand reviendra». [Мальбрук в поход собрался. Бог знает вернется когда.]
Сын только улыбнулся.
– Я не говорю, чтоб это был план, который я одобряю, – сказал сын, – я вам только рассказал, что есть. Наполеон уже составил свой план не хуже этого.
– Ну, новенького ты мне ничего не сказал. – И старик задумчиво проговорил про себя скороговоркой: – Dieu sait quand reviendra. – Иди в cтоловую.


В назначенный час, напудренный и выбритый, князь вышел в столовую, где ожидала его невестка, княжна Марья, m lle Бурьен и архитектор князя, по странной прихоти его допускаемый к столу, хотя по своему положению незначительный человек этот никак не мог рассчитывать на такую честь. Князь, твердо державшийся в жизни различия состояний и редко допускавший к столу даже важных губернских чиновников, вдруг на архитекторе Михайле Ивановиче, сморкавшемся в углу в клетчатый платок, доказывал, что все люди равны, и не раз внушал своей дочери, что Михайла Иванович ничем не хуже нас с тобой. За столом князь чаще всего обращался к бессловесному Михайле Ивановичу.
В столовой, громадно высокой, как и все комнаты в доме, ожидали выхода князя домашние и официанты, стоявшие за каждым стулом; дворецкий, с салфеткой на руке, оглядывал сервировку, мигая лакеям и постоянно перебегая беспокойным взглядом от стенных часов к двери, из которой должен был появиться князь. Князь Андрей глядел на огромную, новую для него, золотую раму с изображением генеалогического дерева князей Болконских, висевшую напротив такой же громадной рамы с дурно сделанным (видимо, рукою домашнего живописца) изображением владетельного князя в короне, который должен был происходить от Рюрика и быть родоначальником рода Болконских. Князь Андрей смотрел на это генеалогическое дерево, покачивая головой, и посмеивался с тем видом, с каким смотрят на похожий до смешного портрет.
– Как я узнаю его всего тут! – сказал он княжне Марье, подошедшей к нему.
Княжна Марья с удивлением посмотрела на брата. Она не понимала, чему он улыбался. Всё сделанное ее отцом возбуждало в ней благоговение, которое не подлежало обсуждению.
– У каждого своя Ахиллесова пятка, – продолжал князь Андрей. – С его огромным умом donner dans ce ridicule! [поддаваться этой мелочности!]
Княжна Марья не могла понять смелости суждений своего брата и готовилась возражать ему, как послышались из кабинета ожидаемые шаги: князь входил быстро, весело, как он и всегда ходил, как будто умышленно своими торопливыми манерами представляя противоположность строгому порядку дома.
В то же мгновение большие часы пробили два, и тонким голоском отозвались в гостиной другие. Князь остановился; из под висячих густых бровей оживленные, блестящие, строгие глаза оглядели всех и остановились на молодой княгине. Молодая княгиня испытывала в то время то чувство, какое испытывают придворные на царском выходе, то чувство страха и почтения, которое возбуждал этот старик во всех приближенных. Он погладил княгиню по голове и потом неловким движением потрепал ее по затылку.
– Я рад, я рад, – проговорил он и, пристально еще взглянув ей в глаза, быстро отошел и сел на свое место. – Садитесь, садитесь! Михаил Иванович, садитесь.
Он указал невестке место подле себя. Официант отодвинул для нее стул.
– Го, го! – сказал старик, оглядывая ее округленную талию. – Поторопилась, нехорошо!
Он засмеялся сухо, холодно, неприятно, как он всегда смеялся, одним ртом, а не глазами.
– Ходить надо, ходить, как можно больше, как можно больше, – сказал он.
Маленькая княгиня не слыхала или не хотела слышать его слов. Она молчала и казалась смущенною. Князь спросил ее об отце, и княгиня заговорила и улыбнулась. Он спросил ее об общих знакомых: княгиня еще более оживилась и стала рассказывать, передавая князю поклоны и городские сплетни.
– La comtesse Apraksine, la pauvre, a perdu son Mariei, et elle a pleure les larmes de ses yeux, [Княгиня Апраксина, бедняжка, потеряла своего мужа и выплакала все глаза свои,] – говорила она, всё более и более оживляясь.
По мере того как она оживлялась, князь всё строже и строже смотрел на нее и вдруг, как будто достаточно изучив ее и составив себе ясное о ней понятие, отвернулся от нее и обратился к Михайлу Ивановичу.
– Ну, что, Михайла Иванович, Буонапарте то нашему плохо приходится. Как мне князь Андрей (он всегда так называл сына в третьем лице) порассказал, какие на него силы собираются! А мы с вами всё его пустым человеком считали.
Михаил Иванович, решительно не знавший, когда это мы с вами говорили такие слова о Бонапарте, но понимавший, что он был нужен для вступления в любимый разговор, удивленно взглянул на молодого князя, сам не зная, что из этого выйдет.
– Он у меня тактик великий! – сказал князь сыну, указывая на архитектора.
И разговор зашел опять о войне, о Бонапарте и нынешних генералах и государственных людях. Старый князь, казалось, был убежден не только в том, что все теперешние деятели были мальчишки, не смыслившие и азбуки военного и государственного дела, и что Бонапарте был ничтожный французишка, имевший успех только потому, что уже не было Потемкиных и Суворовых противопоставить ему; но он был убежден даже, что никаких политических затруднений не было в Европе, не было и войны, а была какая то кукольная комедия, в которую играли нынешние люди, притворяясь, что делают дело. Князь Андрей весело выдерживал насмешки отца над новыми людьми и с видимою радостью вызывал отца на разговор и слушал его.
– Всё кажется хорошим, что было прежде, – сказал он, – а разве тот же Суворов не попался в ловушку, которую ему поставил Моро, и не умел из нее выпутаться?
– Это кто тебе сказал? Кто сказал? – крикнул князь. – Суворов! – И он отбросил тарелку, которую живо подхватил Тихон. – Суворов!… Подумавши, князь Андрей. Два: Фридрих и Суворов… Моро! Моро был бы в плену, коли бы у Суворова руки свободны были; а у него на руках сидели хофс кригс вурст шнапс рат. Ему чорт не рад. Вот пойдете, эти хофс кригс вурст раты узнаете! Суворов с ними не сладил, так уж где ж Михайле Кутузову сладить? Нет, дружок, – продолжал он, – вам с своими генералами против Бонапарте не обойтись; надо французов взять, чтобы своя своих не познаша и своя своих побиваша. Немца Палена в Новый Йорк, в Америку, за французом Моро послали, – сказал он, намекая на приглашение, которое в этом году было сделано Моро вступить в русскую службу. – Чудеса!… Что Потемкины, Суворовы, Орловы разве немцы были? Нет, брат, либо там вы все с ума сошли, либо я из ума выжил. Дай вам Бог, а мы посмотрим. Бонапарте у них стал полководец великий! Гм!…
– Я ничего не говорю, чтобы все распоряжения были хороши, – сказал князь Андрей, – только я не могу понять, как вы можете так судить о Бонапарте. Смейтесь, как хотите, а Бонапарте всё таки великий полководец!
– Михайла Иванович! – закричал старый князь архитектору, который, занявшись жарким, надеялся, что про него забыли. – Я вам говорил, что Бонапарте великий тактик? Вон и он говорит.