**Swing**` գրադարան Java ծրագրերի համար գրաֆիկական ինտերֆեյս ստեղծելու համար։ Swing-ը մշակվել է Sun Microsystems-ի կողմից։ Այն պարունակում է մի շարք գրաֆիկական բաղադրիչներ (անգլ.՝ Swing widgets), ինչպիսիք են կոճակները, մուտքագրման դաշտերը, աղյուսակները և այլն։

Swing-ը վերաբերում է JFC դասի գրադարանին, որը գրադարանների հավաքածու է GUI-ների մշակման համար։ Այս գրադարանները ներառում են 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-ները։

* *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 (անգլ.՝ 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-ի հետ համեմատություն
------------------------

The Standard Widget Toolkit-ը (SWT) մրցակցային գործիքակազմ է, որն ի սկզբանե մշակվել է IBM-ի կողմից և այժմ պահպանվում է Eclipse կազմակերպության կողմից։ SWT-ի ներդրումն ավելի շատ ընդհանրություններ ունի AWT-ի ծանր քաշային բաղադրիչների հետ։ Սա տալիս է առավելություններ, ինչպիսիք են ավելի ճշգրիտ հավատարմությունը հիմքում ընկած բնապատկերային պատուհանների գործիքակազմի հետ՝ ծրագրավորման մոդելում տեղական հարթակի ավելի մեծ ազդեցության գնով։

Եղել են զգալի բանավեճեր և շահարկումներ SWT-ի և Swing-ի արդյունավետության վերաբերյալ. ոմանք ակնարկել են, որ SWT-ի մեծ կախվածությունը JNI-ից կդանդաղեցնի այն, երբ GUI բաղադրիչը և Java-ն պետք է հաղորդակցեն տվյալները, բայց ավելի արագ՝ երբ տվյալների մոդելը բեռնված է GUI-ում, բայց դա ոչ մի կերպ չի հաստատվել։ 2005-ին չափորոշիչների բավականին մանրակրկիտ փաթեթը եզրակացրեց, որ ոչ Swing-ը, ոչ էլ 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 Archived 2011-08-28 at the Wayback Machine. (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
2. ↑  Strenn Stephen (2006-03-03)։ «Swing vs. SWT Performance - Have a Look at the Call Stacks»։ *Javalobby*։ Արխիվացված է օրիգինալից 2017-09-17-ին  `|df=` պարամետրը գոյություն չունի (օգնություն)
3. ↑  Žagar Klemen, Križnar Igor (2006-03-03)։ «SWT Vs. Swing Performance Comparison» (1.4 ed.)։ Cosylab։ Արխիվացված է օրիգինալից 2015-05-26-ին։ «*It is hard to give a rule-of-thumb where SWT would outperform Swing, or vice versa. In some environments (e.g. Windows), SWT is a winner. In others (Linux, VMware hosting Windows), Swing and its redraw optimization outperform SWT significantly. Differences in performance are significant: factors of 2 and more are common, in either direction.*»  `|url-status=` պարամետրը գոյություն չունի (օգնություն); `|df=` պարամետրը գոյություն չունի (օգնություն)

Գրականություն
-------------

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

Արտաքին հղումներ
----------------

* Введение в Swing (ռուս.) [недоступно]
* JDK 6 Swing APIs & Developer Guides — from Oracle Coorp (անգլ.)
* Creating a GUI with JFC/Swing: Examples (անգլ.)
* A Swing Architecture Overview (անգլ.)
* Swing Sightings: список приложений на Swing (անգլ.)