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-ում։
Swing ճարտարապետությունը նախագծված է այնպես, որ դուք կարողանաք փոխել ձեր հավելվածի «Look and Feel»-ը (L&F): «Look»-ը որոշում է բաղադրիչների արտաքին տեսքը, իսկ «Feel»-ը՝ նրանց վարքագիծը։ Sun's JRE-ն տրամադրում է հետևյալ L&F-ները[1]։
Swing-ն ապահովում է ավելի ճկուն ինտերֆեյսի բաղադրիչներ, քան նախկին AWT գրադարանը։ Ի տարբերություն AWT-ի, Swing բաղադրիչները նախագծված են նույն կերպ աշխատելու հարթակներում, մինչդեռ AWT բաղադրիչները հետևում են գործարկվող պլատֆորմի միջերեսին առանց փոփոխությունների։ Մյուս կողմից, AWT-ն օգտագործում է միայն ստանդարտ ՕՀ-ի տարրեր ցուցադրման համար, այսինքն՝ յուրաքանչյուր տարրի համար ստեղծվում է առանձին ՕՀ օբյեկտ (պատուհան), և հետևաբար AWT-ն թույլ չի տալիս ստեղծել կամայական ձևի տարրեր (հնարավոր է օգտագործել միայն ուղղանկյուն բաղադրիչներ), AWT-ի վրա հիմնված հսկիչները միշտ ցուցադրվում են Swing տարրերի վերևում (քանի որ Swing-ի բոլոր բաղադրիչները ցուցադրվում են տարայի մակերեսին)։
Swing բաղադրիչները աջակցում են հատուկ plugable look-and-feel (անգլ.՝ plugable look-and-feel), որի շնորհիվ հնարավոր է հարմարվել հարթակի գրաֆիկական ինտերֆեյսին (այսինքն՝ օպերացիոն համակարգին հատուկ մեկ այլը կարող է լինել. դինամիկ միացված բաղադրիչին, ներառյալ ծրագրավորողի տեսքը և վարքագիծը ստեղծվածը)։ Այսպիսով, Swing-ն օգտագործող հավելվածները կարող են նմանվել այդ օպերացիոն համակարգի բնիկ հավելվածներին։ Նման «թեթև» (անգլ.՝ Lightweight) բաղադրիչների հիմնական թերությունը նրանց համեմատաբար դանդաղ աշխատանքն է։ Դրական կողմը ստեղծված հավելվածների ինտերֆեյսի ունիվերսալությունն է բոլոր հարթակներում։
«Lightweight» նշանակում է, որ Swing բաղադրիչները գծվում են հենց բաղադրիչների կողմից մայր պատուհանի մակերեսի վրա՝ առանց օպերացիոն համակարգի բաղադրիչների օգտագործման։ Ի տարբերություն «ծանր» AWT բաղադրիչների՝ Swing հավելվածը կարող է ունենալ միայն մեկ պատուհան, իսկ մնացած բոլոր բաղադրիչները գծված են մոտակա մայրիկի վրա, որն ունի իր սեփական պատուհանը (օրինակ՝ JFrame): Հնարավոր է, որ հավելվածը խառնի Swing և AWT տարրերը, չնայած դա կարող է առաջացնել որոշ խնդիրներ. մասնավորապես, AWT բաղադրիչները միշտ համընկնում են Swing տարրերի վրա, ինչպես նաև ծածկում են JPopupMenu և JComboBox թռուցիկ ընտրացանկերը։ Դա կանխելու համար այս բաղադրիչներն ունեն setLightWeightPopupEnabled(boolean) մեթոդներ՝ անջատելու թեթև թռուցիկ տարրերի օգտագործումը։ Սահմանելով հատկությունը true (setLightWeightPopupEnabled(true)) AWT տարրերը չեն համընկնի ցանկի հետ։
The Standard Widget Toolkit-ը (SWT) մրցակցային գործիքակազմ է, որն ի սկզբանե մշակվել է IBM-ի կողմից և այժմ պահպանվում է Eclipse կազմակերպության կողմից։ SWT-ի ներդրումն ավելի շատ ընդհանրություններ ունի AWT-ի ծանր քաշային բաղադրիչների հետ։ Սա տալիս է առավելություններ, ինչպիսիք են ավելի ճշգրիտ հավատարմությունը հիմքում ընկած բնապատկերային պատուհանների գործիքակազմի հետ՝ ծրագրավորման մոդելում տեղական հարթակի ավելի մեծ ազդեցության գնով։
Եղել են զգալի բանավեճեր և շահարկումներ SWT-ի և Swing-ի արդյունավետության վերաբերյալ. ոմանք ակնարկել են, որ SWT-ի մեծ կախվածությունը JNI-ից կդանդաղեցնի այն, երբ GUI բաղադրիչը և Java-ն պետք է հաղորդակցեն տվյալները, բայց ավելի արագ՝ երբ տվյալների մոդելը բեռնված է GUI-ում, բայց դա ոչ մի կերպ չի հաստատվել[2]։ 2005-ին չափորոշիչների բավականին մանրակրկիտ փաթեթը եզրակացրեց, որ ոչ Swing-ը, ոչ էլ SWT-ն ակնհայտորեն չեն գերազանցում մյուսներին ընդհանուր դեպքում[3]։
«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
}