Swing

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
    }

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

 Введение в Swing   [недоступно]
 JDK 6 Swing APIs & Developer Guides — from Oracle Coorp 
 Creating a GUI with JFC/Swing: Examples 
 A Swing Architecture Overview 
 Swing Sightings: список приложений на Swing

Ծանոթագրություններ

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

 
 

Ջավա