Swing
Swing — інструментарій для створення графічного інтерфейсу користувача (GUI) мовою програмування Java. Це частина бібліотеки базових класів Java (JFC, Java Foundation Classes).
Swing розробляли для забезпечення функціональнішого набору програмних компонентів для створення графічного інтерфейсу користувача, ніж у ранішого інструментарію AWT. Компоненти Swing підтримують специфічні look-and-feel модулі, що динамічно підключаються. Завдяки ним можлива емуляція графічного інтерфейсу платформи (тобто до компоненту можна динамічно підключити інші, специфічні для даної операційної системи вигляд і поведінку). Основним недоліком таких компонентів є відносно повільна робота, хоча останнім часом це не вдалося підтвердити через зростання потужності персональних комп'ютерів. Позитивна сторона —— універсальність інтерфейсу створених програм на всіх платформах.
Історія
На початку існування Java класів Swing не було взагалі. Через слабкі місця в AWT (початковій GUI системі Java) було створено Swing. AWT визначає базовий набір елементів керування, вікон та діалогів, які підтримують придатний до використання, але обмежений у можливостях графічний інтерфейс. Однією з причин обмеженості AWT є те, що AWT перетворює свої візуальні компоненти у відповідні їм еквіваленти, що не залежать від платформи, які називаються рівноправними компонентами. Це означає, що зовнішній вигляд компонентів визначається платформою, а не закладається в Java. Оскільки компоненти AWT використовують «рідні» ресурси коду, вони називаються ваговитими (англ. highweigh).
Використання «рідних» рівноправних компонентів породжує деякі проблеми. По-перше, у зв'язку із різницею, що існує між операційними системами, компонент може виглядати або навіть вести себе по-різному на різноманітних платформах. Така мінливість суперечила філософії Java: «написане один раз, працює скрізь». По-друге, зовнішній вигляд кожного компонента був фіксованим (оскільки усе залежало від платформи), і це неможливо було змінити (принаймні, це важко було зробити). По-третє, використання ваговитих компонентів тягнуло за собою появу нових обмежень. Наприклад, ваговитий компонент завжди має прямокутну форму і є непрозорим.
Незабаром після появи початкової версії Java, стало очевидним, що обмеження, властиві AWT, були настільки незручними, що потрібно було знайти кращий підхід. У результаті з'явились класи Swing як частина бібліотеки базових класів Java (JFC). В 1997 році вони були включені до Java 1.1 у вигляді окремої бібліотеки. А починаючи з версії Java 1.2, класи Swing (а також усі останні, що входили до JFC) стали повністю інтегрованимими у Java.
Архітектура
Незалежність від платформи: Swing — платформо-незалежна бібліотека, що означає, що програму з використанням Swing можна запустити на всіх платформах, які підтримують JVM.
Можливість для розширення: Swing — дуже розподілена архітектура, яка дозволяє «підключати» реалізації користувача вказаної інфраструктури інтерфейсів: користувачі можуть створити свою власну реалізацію цих компонентів, щоб замінити компоненти без обумовлення (за замовчуванням). Взагалі, користувачі Swing можуть розширити структуру, продовжуючи (з допомогою extends) існуючі класи і/або створюючи альтернативні реалізації основних компонентів.
Приклад
Наступний код демонструє основи використання Swing. Ця програма зображує вікно (JFrame), у вікні міститиметься кнопка з написом «Натисніть сюди» на ній та написом праворуч «Ця кнопка не робить нічого:».
package com.example; // Імпортує swing і AWT класи import java.awt.EventQueue; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.WindowConstants; /** * Простий приклад використання Swing */ public class SwingExample { public static void main(String[] args) { // Упевнюємося, що всі виклики Swing/AWT виконуються Event Dispatch Thread ("EDT") EventQueue.invokeLater(new Runnable() { @Override public void run() { // Створюємо JFrame, що має вигляд вікна з "декораціями", // наприклад заголовком і кнопкою закриття JFrame f = new JFrame("Приклад вікна Swing"); // Установлюємо простий менеджер розмітки, що впорядковує всі компоненти f.setLayout(new FlowLayout()); // Додаємо компоненти f.add(new JLabel("Ця кнопка не робить нічого:")); f.add(new JButton("Натисніть сюди!")); // "Пакує" вікно, тобто робить його величину відповідну до її компонентів f.pack(); // Встановлюємо стандартну операцію закриття для вікна, // без цього вікно не закриється після активування кнопки закриття // (Стандартно HIDE_ON_CLOSE, що просто приховує вікно) f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); // Уснановлюємо видимість=істина, тим самим показуючи вікно на екрані f.setVisible(true); } }); } }