Study - dev, blog archive, про java swing - частина 1
Про java swing - частина 1
Введення в розробку додатків з графічним інтерфейсом для java
Дана частина методичного посібника буде присвячений використанню бібліотеки swing, її філософії (а вона є і досить відмінна від знайомої вам по MFC), також буде приділено достатньо уваги створенню власних елементів управління.
Врізка: історія розвитку графічної підсистеми java: У ранніх - 1.0.x - версіях Java Development Kit активно використовувалися "важкі" компоненти AWT, тісно пов'язані конкретної апаратної платформою на якій виконувалося додаток. Подальше розгортання концепції "write once, run everywhere" (написати один раз, запускати скрізь) призвело до того, що у версії 1.1.x намітився перехід до універсальних компонентів. Тоді з'явилися "легкі" інтерфейсні класи, в яких будь-який компонент на екрані створюється засобами Java за допомогою графічних класів і методів. Такого роду класи компонентів були об'єднані в бібліотеку під назвою Swing і доступні розробникам в складі як JDK, так і окремого продукту JFC (Java Foundation Classes). Причому для сумісності зі старими версіями JDK старі компоненти з AWT залишилися недоторканими, хоча компанія JavaSoft -, що відповідає за випуск JDK, - рекомендує не змішувати в одній і тій же програмі старі і нові компоненти.
Основні можливості і концепція JFC
Swing GUI Components
Для побудови інтерфейсу розроблено досить велику кількість елементів управління: кнопки, списки, набори закладок ...
Pluggable Look-and-Feel Support
Додатки, які використовують Swing component-и пропонують можливі стратегії того як буде виглять кнопка або текстове поле а також те як вона буде себе вести у взаємодії з користувачем. У стандартному постачанні jdk1.3 були стилі для відображення інтерфейсу під windows / motif / metal і ви самі можете розробити стиль відображення: наприклад в 10 версії borland jbuilder розробники створили власний стиль.
MVC - Model View Controller
Багато компонентів Swing реалізовані за технологією MVC. Це означає, що компонент умовно розбитий на три частини: модель (model), вид (view) і контролер (controller). Кожна з цих частин строго і тільки свою задачу. Модель зберігає важливі дані компонента і забезпечує програмний інтерфейс до них. Вид займається зовнішнім виглядом зображення компонента і тісно пов'язаний з системою настройки інтерфейсу L # 038; F. Контролер же управляє компонентом в цілому, отримуючи сигнали від виду і повідомляючи про зміни модель компонента. Таке розмежування важливо при зміні L # 038; F. Реалізуючи свій компонент для Swing, природно буде зробити його придатним для різних інтерфейсів L # 038; F. Технологія MVC - це все, що вам потрібно. Достатньо написати різні види для Metal L # 038; F, Motif L # 038; F, Windows L # 038; F і т. П. При цьому модель і контролер компонента змінюються.
Засоби для малювання 2d графіки з можливістю відправки зображення на друк, збереження в файлі.
Підтримка D # 038; D як всередині java додатки так і між декількома додатками: java і java, java і створені за допомогою інших мов програми.
Можливість створювати додатки з підтримкою декількох мов.
Всі класи і інтерфейси swing розташовані в пакеті javax.swing або вкладених до складу його. Попередня версія бібліотеки awt а також ряд класів носять допоміжний характер і не змінилися знаходяться в пакеті java.awt. так, що на початку вашого проекту завжди підключайте пакети:
Примітка: способи постачання та розповсюдження програм з використанням swing. Оскільки бібліотека swing входить в стандартну поставку jre (java runtime environment), то особливих проблем тут немає. Інша справа, якщо ваше додаток використовує сторонні бібліотеки і їх досить багато, особливо явно ця проблема виникає при створенні веб-додатків. Sun розробила технологію java web start (необхідні для її роботи компоненти встановлюються разом з jre). Ідея полягає в тому, що користувач в інтернеті викачує і запускає на виконання маленький текстової файлик з розширенням jnlp, тут же підсистема java web start викачує з сайту sun чи інших постачальників необхідні бібліотеки. Створює ярлик для запуску - додаток готове для роботи.
java 2d api
Почнемо з простого: створимо додаток використовує кошти 2d графіки. Перш за все необхідно створити основу - "полотно" для малювання для цього слід створити діалогове вікно. Вам слід використовувати або клас Jframe (для немодального вікон) або Jdialog (соответствнно для модальних).
Тут створюється об'єкт "діалогове вікна". Як параметр конструктора вказується тест Заголовок вікна. Потім визначається що має статися при закритті цього вікна (коли натиснули на маленький хрестик в правому верхньому куті віконця). Можливі такі варіанти (всі ці константи визначені в класі WindowConstants):
• DO_NOTHING_ON_CLOSE - нічого не робити. Вікно не закриється і нічого не станеться.
• HIDE_ON_CLOSE - вікно буде заховано.
• DISPOSE_ON_CLOSE - вікно як і в попередньому випадку буде заховано, але при цьому і знищено (не назовсім, просто частина ресурсів операційної системи, які використовувалися для відображення вікна будуть "звільнені"). Повторно вікно можна показати за допомогою виклику setVisible (хоча це може зайняти трохи більше часу ніж "просто заховати і не звільняти ніяких ресурсів" - HIDE_ON_CLOSE).
• EXIT_ON_CLOSE - по закриттю форми додаток завершується використовуючи виклик System.exit ().
Потім я встановив розміри, використовуючи при виклику setSize або явно задані розміри - ширина або висота або обгортку у вигляді об'єкта Dimension (запам'ятайте цей клас, багато методи графічної підсистеми вказують розміри чого-небудь за допомогою об'єктів цього класу).
Почнемо з простого: на формі повинна малюватися якась геометрична «композиція» при створенні якої буде використано максимальну кількість методів.
Важливо: модель обробки подій в стилі MFC з картами подій в swing не використовується - замість цього ви повинні або перекривати методи класів-предків, або використовувати концепцію "слухачів" (почнемо з першого способу).
• При подію перемальовування викликається віртуальний метод paint, в якості єдиного параметра йому передається значення об'єкта Graphics, який подібний до контексту пристрою CDC в стилі MFC.
• У прикладі використовується метод getSize, який повертає об'єкт Dimension зберігає розміри вікна.
• При завданні кольору за допомогою виклику
колір задається колір в форматі RGBA. Де остання компонента - прозорість. А другий параметр конструктора Color вказує на те, чи є ця прозорість чи ні. Alpha компонент займає біти з 24-31, червоний компонент 16-23, зелений - 8-15, і синій, відповідно, - 0-7. У загальному випадку, в складі класу Color є варіанти конструктора, в якому всі вищезазначені компоненти задаються явно і окремо:
При завданні кольору враховуйте, то змінна якого типу використовується. Якщо змінна ціла, то значення має бути в діапазоні від 0 до 255, якщо матеріальна, то 0-1.
• При виклику методу fillRect виконується зафарбування площі прямокутника поточним кольором - фактично і рамка об'єкта і фон однакові.
Далі наводиться довідковий посібник з методів класу Graphics:
Очистіть зазначеної області в якості кольору заповнення використовується той що вважається кольором за замовчуванням для пристрою на якому йде малювання. Простіше кажучи, це білий.
Змінюється поточна область відсікання.
Копіює область з вказаними координатами (перший 4-е параметра) в зазначену точку.
Створює новий контекст, що є копією існуючого.
Знищує і звільняє ресурси контексту.
Вимальовується прямокутник з тривимірною рамкою. Raised - вказує на те, чи буде даний прямокутник візуально "піднятий" або "втоплений".
Малюємо дугу еліпса зазначеного розміру. Дуга повинна мати початковий кут (startAngle) і саме значення кута (arcAngle).
Малює зображення у зазначеній точці і зазначеного розміру. Змінні починаються на "d" ( "destination") - приймач, а "s" ( "source"), відповідно, - джерело зображення. Також задається фоновий колір і об'єкт сповіщувач. Незнайома вам по MFC концепція об'єктів, які зацікавлені в отриманні сповіщення про те, що якась операція була успішно виконана. При необхідності виконується масштабування зображення.
Всі ці фігури, окрім Point2D і Dimension2D, підтримують інтерфейс Shape. У цьому інтерфейсі знаходяться методи описують фігури. І, відповідно, при бажанні ви можете створити власний клас, який буде представляти нестандартну геометричну фігуру.
Для подання фігур схожих на прямокутник служать класи: Rectangle2D, RoundRectangle2D, Arc2D, і Ellipse2D.
Клас QuadCurve2D дозволяє створити криву, описувану (тавтологія.) Кривої другого порядку (визначається, така крива двома точками на її краях і контрольною точкою). Відповідно, CubicCurve2D задає криву третього порядку, для її завдання вам потрібні дві кінцеві точки і вже дві крапки, що управляють.

Особливий інтерес представляє клас GeneralPath. Який дозволяє задати фігуру по опорних точках.

Особливий інтерес представляє собою комбінування фігур - для цього використовується клас Area:
У складі класу Area є методи для всіх булевих операцій над об'єктами:
Трансформація фігур, тексту і зображень
Повертаючись до параметрів керуючими Graphics2D, розглянемо як можна трансформувати об'єкти. Ви можете виконувати над графічними об'єктами операції: переміщення, обертання, масштабування, усічення об'єктів на стадії рендеринга. Всі ці перетворення задаються за допомогою об'єктів похідних від AffineTransform.
Важливо: всі Афінах перетворення не призводять до переходу до нової системи координат, в якій, наприклад, лінії, які були не паралельні стали б такими або навпаки.
Клас Graphics2D надає кілька методів для трансформації. Вам потрібно створити об'єкт AffineTransform і потім викликати метод transform в складі Graphics2D.
Для створення об'єкта AffineTransform необхідно скористатися фабричними методами в складі AffineTransform:
Матриці перетворення для всіх цих операцій:

Обробка зображень
Примітка: часто об'єкти, які необхідно отрисовать на вікні мають унікальні розміри і форму. Таку, що її важко відтворити за допомогою Shape і Clip-відсікань для Graphics2D. Тоді ми створюємо зображення у вигляді GIF з прозорим кольором (в java підтримка прозорості GIF є по-замовчуванню, просто завантажте GIF і використовуйте його при виклику Graphics.drawImage).
Спостерігачі: як я говорив раніше завантаження зображення може займати деякий час в загальному випадку для очікування використовується клас MediaTracker ми його вже використовували раніше, але він є занадто важким інструментом не дозволяє відстежувати процес завантаження зображення. Для цього використовуються класи спостерігачів: Observer.
Критично важливо: при виклику методу:
Я можу загрудать тільки файли в форматі JPEG, GIF, PNG. Також я досить вальяжно викликав даний метод в подію перемальовування (кожна подія - виклик getImage) вся справа в тому, що клас Toolkit виконує кешування зображень і деякий час зберігає його в пам'яті.
Для уявлення виробника зображення використовується інтерфейс ImageProducer. Враховуйте, що в якості джерела зображення може бути не тільки файл, а всі що завгодно (аби воно підтримувало даний інтерфейс). У прикладі далі використовується клас MemoryImageSource, який дозволяє створити зображення у вмісті масиву чисел. Якщо у вас є об'єкт Image, то для отримання посилання на його виробника скористайтеся методом getSource.
І десь в коді методу paint (Graphics g) викликаємо метод:
Для уявлення споживача використовуйте інтерфейс ImageConsumer. Для зв'язування або, точніше, обгортки джерела зображень за допомогою фільтра використовуйте клас ImageFilter. Для демонстрації методів роботи з ними буде використаний приклад, коли зображення стає яскравішим або більш тьмяним. Однак технічно нам буде потрібно перейти від уявлення кольору в стилі RGBA до колірної моделі HSB. Дана схема являє колірний простір у вигляді перекинутої піраміди, вершина якої розташована в центрі координат. Від вершини перпендикулярно площині квітів йде вісь яскравості, яку ми і будемо змінювати.

Врізка: загальне уявлення про колірних моделях. Модель HSB (Hue Saturation Brightness = Тон Насиченість Яскравість) побудована на основі суб'єктивного сприйняття кольору людиною. Запропоновано в 1978 році. Ця модель теж заснована на кольорах моделі RGB, але будь-який колір в ній визначається своїм кольором (тоном), насиченістю (тобто додаванням до нього білої фарби) і яскравістю (тобто додаванням до нього чорної фарби). Фактично будь-який колір виходить з спектрального додаванням сірої фарби. Ця модель апаратно-залежна і не відповідає сприйняттю людського ока, так як око сприймає спектральні кольору як кольору з різною яскравістю (синій здається більш темним, ніж червоний), а в моделі HSB їм всім приписується яскравість 100%. Модель є апаратно-залежною. H визначає частоту світла і приймає значення від 0 до 360 градусів. V або B: V - значення (приймає значення від 0 до 1) або B - яскравість, яка визначає рівень білого світла (приймає значення від 0 до 100%). Є висотою конуса. S - визначає насиченість кольору. Значення її є радіусом конуса.
У складі класу Color є методи для перетворення між колірною моделлю CMYK і RGB: HSBtoRGB і RGBtoHSB: