Swing

Приклад Swing-інтерфейсу для X Window System.

Swing - бібліотека для створення графічного інтерфейсу для програм на мові Java. Swing був розроблений компанією Sun Microsystems. Він містить ряд графічних компонентів ( англ. Swing widgets ), Таких як кнопки, поля введення, таблиці і т. д.

Swing відноситься до бібліотеки класів JFC, яка являє собою набір бібліотек для розробки графічних оболонок. До цих бібліотекам відносяться Java 2D, Accessibility-API, Drag & Drop -API і AWT.


1. Історія

Починаючи з версії Java 1.2 ( 1998) Swing включений в Java Runtime Environment.

2. Архітектура

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 одночасно.

3. Порівняння з AWT

Swing надає більш гнучкі інтерфейсні компоненти, чим більш рання бібліотека AWT. На відміну від AWT, компоненти Swing розроблені для однакової крос-платформної роботи, в той час як компоненти AWT повторюють інтерфейс виконуваною платформи без змін. AWT ж використовує тільки стандартні елементи ОС для відображення, тобто для кожного елементу створюється окремий об'єкт ОС (вікно), у зв'язку з чим, AWT не дозволяє створювати елементи довільної форми (можливо використовувати тільки прямокутні компоненти), елементи управління на основі AWT завжди відображаються поверх Swing-елементів (так як всі Swing компоненти відображаються на поверхні контейнера).

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


3.1. Принцип Lightweight

"Lightweight" означає, що компоненти Swing отрісовиваємих самими компонентами на поверхні батьківського вікна, без використання компонентів операційної системи. На відміну від "Важких" компонентів AWT, у додатку Swing може матися тільки одне вікно, і всі інші компоненти отрісовиваємих на найближчому батькам, які мають власне вікно (наприклад, на JFrame). У додатку можуть поєднуватися Swing та AWT елементи, хоча це може породжувати деякі проблеми - зокрема, компоненти AWT завжди перекривають Swing елементи, а також закривають собою спливаючі меню JPopupMenu і JComboBox. Для запобігання цього, у цих компонентів є методи setLightWeightPopupEnabled (boolean), що дозволяють заборонити використання "легковагих" спливаючих елементів. При установці властивості в true (setLightWeightPopupEnabled (true)), AWT елементи не будуть перекривати меню.


4. Порівняння з SWT

5. Приклади

"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  }