Jwindow, jframe, jdialog

Вікна є основою для користувача інтерфейсу будь-якій операційній системи. Вони візуально розділяють виконуються в середовищі програми. Вікна, що використовуються в бібліотеці Swing. мало чим відрізняються від вікон бібліотеки AWT, які представляють собою вікна операційної системи.

Всі вікна бібліотеки Swing - а до них відносяться вікно без рамки JWindow. вікно з рамкою JFrame і діалогове вікно JDialog - є винятком з правила, згідно з яким всі компоненти Swing є легковагі компоненти і успадковані від базового класу JComponent. Вікна Swing є важкими контейнерами для розміщення в них легких компонентів, які операційна система не бачить.

Найбільш корисні JFrame методи

Ця група методів дозволяє задати позицію і розміри вікна на екрані. setLocation () задає позицію вікна, setSize () дозволяє вказати його розміри, а за допомогою setBounds () можна відразу поставити прямокутник, який займе ваше вікно на екрані

Дозволяє «упакувати» наявні в вікні компоненти, так щоб вони займали стільки місця, скільки їм необхідно. Компоненти при виклику цього методу переходять в «видиме» стан, хоча і не з'являються на екрані до виклику одного з наступних методів

Відображення вікна на екрані. Після виклику цих методів компоненти переходять в «видиме» стан і починають обслуговуватися чергою подій. Метод show () до того ж проводить валідацію містяться у вікні компонентів

Прибирає вікно з екрану (якщо воно в момент виклику методу мабуть) і звільняє всі належні йому ресурси.

вікно JWindow

«Батьком» всіх вікон Swing є вікно без рамки і без елементів управління JWindow.

Клас JWindow є вікно без рамки і без елементів управління, призначених, наприклад, для його закриття або переміщення. Даний тип вікна дає мінімальні можливості по своєму налагодженні, на відміну від найчастіше використовується вікна JFrame. Вікно без рамки не часто потрібно в програмах. Однак в окремих випадках воно може бути корисно, особливо в тих випадках, коли необхідно ненадовго вивести на екран будь-яку інформацію типу заставки програми або підказку для користувача, і управляти вікном з цією інформацією не потрібно.

Вікна JWindow використовуються спливаючими меню JPopupMenu в тих ситуаціях, коли у вікні програми не вистачає місця для розміщення легкого компонента в шарі POPUP_LAYER багатошарової панелі, де спливаючі меню розташовуються за замовчуванням. У такій ситуації замість легкого компонента створюється невелике вікно без рамки JWindow, яке можна розмістити в будь-якому місці екрану, тому що воно належить операційній системі. У цьому вікні і розміщується спливаюче меню.

Розглянемо приклад JWindowTest. Основна ідея використання вікна без рамки JWindow полягає в копіюванні частини "зображення робочого столу" у вікно програми. Завдяки з'явився в пакеті JDK 1.3 класу Robot можна "знімати" екранну копію робочого столу.

приклад JWindow

У цьому прикладі додаток успадковуємо від вікна JWindow. щоб зручніше викликати методи цього класу і додавати в вікно компоненти. Об'єкт Robot необхідно створювати в блоці try. catch. тому його створення може бути заборонено менеджером безпеки, використовуваним віртуальною машиною Java. Втім, нам порушення безпеки не загрожує, тому що ми створюємо окремий додаток, а не аплет.

Вирізаємо частина зображення "робочого столу" методом createScreenCapture () в стороні він розташування нашого вікна. Потім в панель вмісту вікна додається компонент ImageDraw, який і відображає вирізане зображення робочого столу. Після виведення вікна на екран програма засинає на 10 секунд, а потім закінчує свою роботу.

Скріншот робочого столу з інтерфейсом вікна прикладу JWindow представлений на наступному малюнку.

Jwindow, jframe, jdialog

Перш ніж робити настроювання вікна, в прикладі JWindowTest викликається конструктор базового класу ключовим словом super () без параметрів. Насправді вікна без рамки JWindow обов'язково вимагають при створенні вказувати свого «батька» - вікно з рамкою JFrame, що не завжди може бути незручно. Спеціально для таких випадків в клас JWindow був доданий конструктор без параметрів, який створює допоміжне невидиме вікно JFrame і використовує його як «батька». Після цього всі вікна без рамки, створені таким чином, задіють тільки це вікно і економлять ресурси.

Слід також зазначити, що за допомогою конструктора без параметрів створюється вікно JWindow. нездатне отримувати фокус введення. Найчастіше саме така поведінка необхідно (адже панелям інструментів, спливаючих заставок і меню фокус введення не потрібний). При необхідності отримання фокусу введення, використовуйте метод setFocusableWindowState (true).

вікно JFrame

Вікно JFrame успадковує властивості класу JWindow і являє собою найбільш часто використовується в додатках вікно «загального призначення». Основні відмінності вікна JFrame від JWindow:

  • наявність рамки, яка дозволяє змінювати розмір вікна;
  • наявність заголовка з назвою програми (заголовок може бути порожнім);
  • можливість використання системного меню, що дозволяє проводити маніпуляції з вікном і додатком;
  • наявність кнопок управління для закриття і згортання вікна.

Для розміщення компонентів для користувача інтерфейсу в переважній більшості додатків застосовується клас JFrame. Розробники Swing визначили спеціальний метод закриття вікна setDefaultCloseOperation, істотно спрощує цю операцію. Розглянемо простий JFrame приклад (JFrameWindowListener) з обробкою події закриття вікна.

JFrame приклад

У прикладі створюється вікно JFrame з визначенням заголовка в конструкторі базового класу. Для визначення титульного рядка вікна можна також використовувати метод setTitle () класу JFrame.

Перш ніж поставити розміри вікна і відобразити його на екрані, викликається метод setDefaultCloseOperation (). Даний метод дозволяє вказати, яку дію буде вироблено при попередній обробці події processWindowEvent () перед закриттям вікна. За замовчуванням використовується константа HIDE_ON_CLOSE, що прибирає вікно з екрану при його закритті. Можна використовувати значення EXIT_ON_CLOSE, яке вказує, що при закритті вікна необхідно закінчити роботу програми.

У прикладі методу setDefaultCloseOperation передається константа DO_NOTHING_ON_CLOSE - нічого не робити при закритті вікна. Під вікно JFrame підключається слухач і обробка події закриття вікна виконується в методі windowClosing. Алгоритм обробки побудований таким чином, що вікно закривається при третій спробі. Номер спроби відображається в мітці інтерфейсу.

Скріншот робочого столу з інтерфейсом вікна нашої програми представлений на наступному малюнку.

Для визначення іконки вікна необхідно використовувати метод setIconImage (). Іконка розташовується на кнопці згорнутого вікна або в заголовку вікна в нормальному стані.

З додаткових можливостей вікна з рамкою JFrame слід згадати про його здатності «ховати» свої «прикраси»: рамку і елементи управління вікном. Робить це метод JWindow.

Події вікон, WindowListener, WindowFocusListener

Вікна Swing (JWindow, JFrame, JDialog) підтримують два типи подій:

  • WindowListener - дозволяє дізнатися про зміни в стані вікна;
  • WindowFocusListener - повідомляє про отримання або втрати компонентами вікна фокусу введення

Повний список методів даних слухачів можна знайти онлайнові технічні характеристики Java.

В інтерфейсі слухача WindowListener частіше інших застосовують метод windowClosing. викликається системою подій при закритті вікна. Розглянутий вище приклад наочно демонструє це.

До кадру JFrame можна підключити слухача вікна, створеного на основі WindowAdapter (щоб не реалізовувати всі певні в інтерфейсі WindowListener методи) і перевизначити метод windowClosing, як це представлено в наступних рядках коду:

При виході з програми відкривається діалогове вікно в панелі JOptionPane і у користувача питається підтвердження, чи дійсно він бажає закінчити роботу з додатком. Якщо відповідь позитивна, то програма завершує роботу.

Діалогове вікно JDialog

Діалогові вікна найчастіше використовуються в додатках для отримання додаткової інформації з метою встановлення параметрів програми, виведення важливою допоміжною / налагоджувальної інформації. Діалогові вікна, як правило, створюються модальними (modal), що блокують доступ до решти вікон програми, поки користувач не закінчить роботу з модальним діалоговим вікном. Модальні діалогові вікна розташовуються поверх основного вікна програми. Зовнішній вигляд діалогових вікон мало відрізняється від вікон з рамкою JFrame, але зазвичай у них менше елементів управління вікна (найчастіше, є тільки кнопка закриття вікна) і відсутнє системне меню.

У Swing діалогові вікна реалізуються класом JDialog. успадкованому від базового класу вікон JWindow і дозволяє створювати як звичайні, так і модальні діалогові вікна. JDialog підтримує як і JFrame закриття вікна, а в іншому схожий з іншими вікнами Swing.

При створенні діалогових вікон Swing необхідно вказати «батьківське вікно», яким може бути вікно з рамкою JFrame або інше діалогове вікно JDialog. Є також конструктор, який не потребує «батьківського» вікна, але використовує допоміжне прозоре вікно, про який було сказано на сторінці «Вікно без рамки JWindow».

JDialog приклад створення діалогових вікон

У прикладі створюємо вікно з рамкою JFrame. в панелі вмісту якого розміщується дві кнопки JButton. При натисканні на кнопки створюються діалогові вікна в окремому методі createDialog (). Діалогове вікно з заданим заголовком JDialog може бути модальним і немодальним. Програма дозволяє створити декілька немодального вікон одночасно, але тільки одне модальне. Немодальні вікна не блокують роботу з основним вікном програми. При закритті діалогового вікна використовується константа DISPOSE_ON_CLOSE, що видаляє вікно після закриття.

Інтерфейс роботи прикладу JDialog представлений на наступному скріншоті.

Jwindow, jframe, jdialog

Бібліотека Swing надає набір стандартних діалогових вікон JDialog для отримання і виведення нескладної інформації. Перш ніж створювати власне діалогове вікно, слід розглянути можливість використання стандартного.

оформлення вікон

Починаючи з JDK 1.4 з'явилася можливість налаштовувати так зване візуальне «оформлення» вікон: рамка, елементи управління вікном (кнопки закриття або згортання), системне меню. Необхідність цього відчувалася з найперших випусків Swing.

Зараз створення різних інтерфейсів вікон можлива завдяки вдосконаленням в UI-представника кореневої панелі JRootPane. UI-представник дозволяє створювати спеціальні рамки, заголовок, системне меню і кнопки управління вікном, і розміщувати їх в кореневий панелі потрібним чином, використовуючи спеціалізований менеджер розташування. Менеджер розташування контролює простір кореневої панелі. Крім цього, при новому оформленні вікон відключаються системні елементи вікна.

У класах JFrame і JDialog є статичний метод setDefaultLookAndFeelDecorated (), що забезпечує можливість оформлення всіх створюваних вікон.

Приклад оформлення вікон. JDialog decoration

У прикладі створюється просте вікно з рамкою і діалогове вікно. Перед створення вікон викликається метод setDefaultLookAndFeelDecorated (), що означає, що для створюваних вікон JFrame і JDialog потрібно спеціальне оформлення. Далі визначаються розміри вікон і вони виводяться на екран.

Слід звернути увагу на метод кореневої панелі setWindowDecorationStyle (), що дозволяє налаштувати оформлення вікна. Якщо вікно з рамкою має тільки один тип оформлення, то діалогові вікна в залежності від їх мети (подання інформації, повідомлення про помилку і т.д.) можуть виглядати по-різному. У прикладі було визначено, що створюване діалогове вікно потрібно для виведення інформації і має виглядати відповідним чином.

Інтерфейс прикладу вікон, оформлених з зовнішнім виглядом Metal, представлений на наступному скріншоті.

Jwindow, jframe, jdialog

Спеціальне оформлення вікон може бути корисно як засіб, що дозволяє повністю, аж до вікон, керувати зовнішнім виглядом вашого застосування. Створивши власного UI-представника кореневої панелі, можна надати своєму додатку унікальний вид, легко впізнаваний користувачами.

Тексти програм прикладів, розглянутих у тексті сторінки, можна скачати тут (3.54 Кб).