Java. Повне керівництво. 8-ме видання

9 5 2 Частина ІІІ. Розробка програмного забезпечення з використанням Java

Події: mouseWheel mouse mouseMotion component hierarchyBounds focus

hierarchy propertyЗмінити inputMethod key

У цьому висновку слід звернути увагу на таке. Оскільки клас

ColorsBeansInfо замінює метод getPropertyDescriptors () так, що єдиною властивістю, що повертається, є rectangular, відображається тільки властивість rectangular. Однак оскільки метод getEventSetDescriptors()

не перевизначається в класі ColorsBeansInfo, використовується самодіагностика проектного шаблону і виявляються всі події, включаючи ті, які лежать класу Colors суперкласу Canvas. Пам'ятайте, що якщо не перевизначити один із методів “get”, визначених у класі SimpleBeansInfo, то за замовчуванням буде використано самодіагностику проектного шаблону. Щоб побачити, які зміни були зроблені класом ColorsBeansInfо, потрібно видалити його файл класу і запустити ще раз IntrospectorDemo. Цього разу він надасть звіт щодо більшої кількості властивостей.

до бібліотеки Swing

У частині II цієї книги ви могли бачити, як за допомогою класів бібліотеки AWT можна створювати інтерфейси користувача. Незважаючи на те, що бібліотека AWT є важливою частиною Java, її набір компонентів застосовується для створення графічних інтерфейсів користувача вже не так широко. Сьогодні багато програмістів користуються з цією метою класами бібліотеки Swing. Бібліотека Swingнабір класів, які пропонують більш потужні

та гнучкі компоненти GUI, ніж бібліотека AWT. Взагалі кажучи, сучасний графічний інтерфейс користувача Java побудований на основі бібліотеки Swing.

Розгляду бібліотеки Swing присвячено два розділи. тут виознайомтеся

із основами бібліотеки Swing. Почнемо з опису її основних концепцій. Потім буде представлено загальну форму програми на базі бібліотеки Swing, включаючи додатки та аплети. Наприкінці розділу пояснимо, як за допомогою бібліотеки Swing можна робити малюнки. У наступному розділі буде розглянуто кілька найчастіше використовуваних компонентів бібліотеки Swing. Важливо зрозуміти, що кількість класів та інтерфейсів у пакетах Swing досить велика і що кожен з них просто неможливо розглянути в цій книзі. (Взагалі кажучи, щоб повністю розповісти про бібліотеку Swing, знадобиться окрема книга.) І все ж у цих двох розділах ви зможете дізнатися про бібліотеку Swing найголовніше.

На замітку! Більш змістовний опис бібліотеки Swing можна знайти в моїй книзі Swing: посібник для початківців, переклад якого українською мовою вийшов в І. Д. “Вільямс” у 2007 році.

Витоки бібліотеки Swing

На початку існування мови Java класів бібліотеки Swing був взагалі. Причиною розробки класів бібліотеки Swing було слабке місце у вихідній підсистемі Java AWT AWT. Бібліотека AWT визначає базовий набір елементів керування, вікон та діалогових вікон, які підтримують придатний для використання, але обмежений у можливостях графічний інтерфейс. Однією з причин обмеженості бібліотеки AWT є те, що вона перетворює свої візуальні компоненти на незалежні від платформи відповідні їм еквіваленти, які називаються рівноправними компонентами. Це означає, що зовнішній вигляд компонента визначається платформою, а не закладається в Java. Оскільки компоненти бібліотеки AWT використовують "машинно залежні" ресурси коду, вони називаються великоваговими.

Використання рівноправних компонентів породжує не якіпроблеми.у зв'язку з відмінностями, існуючими між опера-

9 5 4 Частина ІІІ. Розробка програмного забезпечення з використанням Java

ційними системами, компонент може виглядати або навіть поводитися на різних платформах. Така мінливість йшла врозріз з філософією Java: "на писано одного разу, працює скрізь". Зовнішній вигляд кожного компонента був фіксованим (оскільки все залежало від платформи), і це не можна було змінити (принаймні, робилося це важко). ком понентів спричиняла поява нових обмежень. Наприклад, великоваговий компонент має прямокутні обриси і є непрозорим.

Незабаром після появи початкової версії Java стало очевидним, що обмеження, властиві бібліотеці AWT, були настільки серйозними, що потрібно було знайти найкращий підхід. У результаті з'явилися класи Swing як частина набору бібліотек класів Java Foundation Classes (JFC). У 1997 році вони були включені до Java 1.1 у вигляді окремої бібліотеки. А починаючи з версії Java 1.2 класи Swing (а також все інше, що входило до складу набору JFC) стали повністю інтегрованими в Java.

Класи бібліотеки Swing побудовані на основі бібліотеки AWT

Перш ніж продовжити, необхідно зробити одне важливе зауваження: хоча бібліотека Swing знімає деякі обмеження, властиві бібліотеці AWT, вона не замінює бібліотеку AWT. Навпаки, класи бібліотеки Swing побудовані з урахуванням бібліотеки AWT. Ось чому бібліотека AWT досі є важливою частиною Java мови. Крім того, бібліотека Swing використовує той же механізм обробки подій, що й бібліотека AWT. Таким чином, перед використанням бібліотеки Swing потрібно розібратися з тим, як працює бібліотека AWT. (Про бібліотеку AWT йшлося в розділах 24 і 25.Обробці подій бида присвячено розділ 23.)

Дві ключові особливості бібліотеки Swing

Як тільки було сказано, класи бібліотеки Swing були створені для того, щоб усунути обмеження, властиві бібліотеці AWT. Цього вдалося досягти завдяки двом ключовим особливостям: полегшеним компонентам і підключає моєму зовнішньому вигляду. Разом вони пропонують елегантне та просте у використанні рішення проблем бібліотеки AWT. Саме ці дві особливості і визначають суть бібліотеки Swing. Про кожну з них поговоримо зараз.

Компоненти бібліотеки Swing полегшені

За деякими винятками, компоненти бібліотеки Swing є полегшеними. Це означає, що вони написані виключно на мові Java і не перетворюються на рівноправні компоненти, специфічні для плат форм. Отже, полегшені компоненти є більш ефективними та гнучкими. Більше того, оскільки полегшені компоненти не перетворюються на рівноправні компоненти, зовнішній вигляд кожного компонента визначається класами бібліотеки Swing, а не базовою операційною системою. Це означає, що кожен компонент працюватиме однаково на всіх платформах.

Розділ 30. Введення в бібліотеку Swing

Бібліотека Swing підтримує зовнішній вигляд, що підключається.

Бібліотека Swing підтримує принцип зовнішнього вигляду, що підключається (Pluggable Look And FeelОскільки кожен компонент бібліотеки Swing візуалізується кодом Java, а нерівноправними компонентами, зовнішній вигляд компонента знаходиться під контролем бібліотеки Swing. Це говорить про те, що зовнішній вигляд можна відокремити від логіки компонента і робиться в бібліотеці Swing.У цьому є і свою перевагу: так можна змінити спосіб візуалізації компонента, не торкаючись його іншихаспектів. Іншими словами, можна “підключити” новий зовнішній вигляд будь-якого заданого компонента, не створюючи при цьому побічних ефектів у коді, що використовується даний компонент. Більш того, можна визначити набори зовнішніх видів, які будуть представляти різні стилі користувальницького графічного інтерфейсу. Щоб використати певний стиль, потрібно просто "підключити" його зовнішній вигляд. Як тільки це буде зроблено, всі компоненти автоматично візуалізуватимуться за допомогою цього стилю.

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

H3biKjava 7 пропонує такі зовнішні види, як metal, Motif і Nimbus, які доступні всім користувачам бібліотеки Swing. Зовнішній вигляд metal (металевий) також називається зовнішнім виглядом Java. Він не залежить від платформи і доступний у всіх середовищах, де працює Java. Крім того, він ще й вибирається за умовчанням. У Windows можна використовувати зовнішні види Windows і Windows Classic. У цій книзі використовується зовнішній вигляд металу, оскільки він не залежить від платформи.

У загальному випадку візуальний компонент визначається трьома окремими аспектами:

• як компонент виглядає під час візуалізації на екрані;

• як компонент взаємодіє з користувачем;

• інформація про стан компонента.

Незалежно від того, яка архітектуравикористовується для реалізації компонента, вона повинна неявно включати ці три аспекти. Ось уже кілька років свою виняткову ефективність довела архітектура

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

9 5 6 Частина ІІІ. Розробка програмного забезпечення з використанням Java

ля. Наприклад, коли користувач клацає на прапорці, контролер реагує зміною моделі, щоб відобразити вибір користувача (позначка прапорця або зняття позначки). Це згодом призводить до оновлення уявлення. Поділяючи компонент на модель, уявлення та контролер, можна змінювати конкретну реалізацію будь-якого з цих аспектів, не торкаючись інших. Наприклад, різні реалізації уявлень можуть візуалізувати один і той же компонент різними способами, проте це не буде впливати на модель або контролер.

Хоча архітектура MVC та принципи, закладені в її основі, виглядають концептуально, високий рівень поділу між поданням та контролером не дає жодних переваг компонентам бібліотеки Swing. Навпаки, бібліотека Swing використовує модифіковану версію MVC, яка об'єднує подання та контролер в один логічний об'єкт, званий делегатом користувальницького інтерфейсу (UI delegate). У зв'язку з цим підхід, що застосовується в бібліотеці набряку Swing,називається або архітектурою або архітектурою * модель, що розділяється ” (Separable Model). Тому, незважаючи на те, що архітектура компонентів бібліотеки Swing заснована на MVC, вона не використовує її класичну реалізацію.

Зовнішній вигляд у бібліотеці Swing, що підключається, можливий завдяки архітектурі Оскільки представлення і контролер відокремлені від моделі, зовнішній вигляд можна змінювати, не впливаючи на спосіб використання компонента всередині програми. І навпаки, можна налаштувати модель, не впливаючи на спосіб відображення компонента на екрані або реакцію на дії користувача.

Для підтримки архітектури більшість компонентів бібліотеки Swing містить два об'єкти. Один з них представляє модель, а другий — делегата інтерфейсу користувача. Моделі визначаються інтерфейсами. Наприклад, модель кнопки визначається інтерфейсом ButtonModel. Делегати інтерфейсу користувача є класами, успадкованими від ComponentUI. Наприклад, делегатом інтерфейсу кнопки є ButtonUI. Як правило, ваші програми не будуть взаємодіяти безпосередньо з делегатами інтерфейсу користувача.

Компоненти та контейнери

Графічний інтерфейс бібліотеки Swing складається з двох ключових елементів: компонентів і контейнерів. Однак це в основному концептуальний поділ, оскільки всі контейнери теж є компонентами. Відмінність між цими двома елементами криється в їхньому призначенні: компонент є незалежним візуальним елементом управління на кшталт кнопки або повзунка, а контейнер вміщує групу компонентів. Таким чином, контейнер є особливим типом компонента та призначений для утримання інших компонентів. Більше того, щоб можна було відобразити компонент, він повинен знаходитись усередині контейнера. Так,у всіх графічних інтерфейсах бібліотеки Swing є як мінімум один контейнер. Оскільки контейнери є складовими, контейнер може містити інші контейнери. Завдяки цьому принципу бібліотека Swing може визначити ієрархію місткості, на вершині якої повинен знаходитись контейнер верхнього рівня.

А тепер давайте ближче познайомимося з компонентами та контейнерами.

Розділ 30. Введення в бібліотеку Swing

У випадку компоненти бібліотеки Swing походять від класу JСomponent. (Винятком є ​​чотири контейнери верхнього рівня, про які йдеться в наступному розділі.) Клас JComponent пропонує функціональні можливості, загальні для всіх компонентів. Наприклад, клас JComponent підтримує зовнішній вигляд, що підключається. Клас JComponent успадковує класи бібліотеки AWT Container та Component. Отже, компонент бібліотеки Swing заснований на компоненті бібліотеки AWT та сумісний з ним.