Swing — інструментарій для створення графічного інтерфейсу користувача (GUI) мовою програмування Java. Це частина бібліотеки базових класів Java (JFC, Java Foundation Classes).

Приклад інтерфейсу програми із Swing компонентами на Java 5 для X Window System

Swing розробляли для забезпечення функціональнішого набору програмних компонентів для створення графічного інтерфейсу користувача, ніж у ранішого інструментарію AWT. Компоненти Swing підтримують специфічні look-and-feel[en] модулі, що динамічно підключаються. Завдяки їм можлива емуляція графічного інтерфейсу платформи (тобто до компоненту можна динамічно підключити інші, специфічні для даної операційної системи вигляд і поведінку). Основним недоліком таких компонентів є відносно повільна робота, хоча останнім часом це не вдалося підтвердити через зростання потужності персональних комп'ютерів. Позитивна сторона — універсальність інтерфейсу створених програм на всіх платформах.

Історія ред.

На початку існування 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);
            }
        });
    }
}

Література ред.

Посилання ред.

Див. також ред.