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-ները[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 (անգլ.՝ 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-ում, բայց դա ոչ մի կերպ չի հաստատվել[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
}
Ծանոթագրություններ
[խմբագրել | խմբագրել կոդը]- ↑ How to Set the Look and Feel Արխիվացված 2011-08-28 Wayback Machine (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
- ↑ Strenn, Stephen (2006 թ․ մարտի 3). «Swing vs. SWT Performance - Have a Look at the Call Stacks». Javalobby. Արխիվացված է օրիգինալից 2017 թ․ սեպտեմբերի 17-ին.
- ↑ Žagar, Klemen; Križnar, Igor (2006 թ․ մարտի 3). «SWT Vs. Swing Performance Comparison» (PDF) (1.4 ed.). Cosylab. Արխիվացված է օրիգինալից (PDF) 2015 թ․ մայիսի 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.»
Գրականություն
[խմբագրել | խմբագրել կոդը]- Иван Портянкин 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 (անգլ.)