Тема: елементи мови Java для подійно-орієнтованого програмування.
Мета: всебічно ознайомитися із елементами мови Java для подійно-орієнтованого програмування.
Після вивчення матеріалу учень має:
Обладнання: комп’ютери зі встановленими ОС, JDK (Java Developer Kit, комплект розробника Java) та середовищем програмування мовою Java. Наприклад, Eclipse чи Netbeans, для яких подано опис створення програми.
Структура уроку
Хід уроку
1. Організаційний момент
Привітання з учнями. Перевірка присутності і готовності учнів до уроку. Перевірка виконання домашнього завдання. Оголошення теми й мети уроку.
2. Актуалізація опорних знань
Дати означення понять щодо об'єктно-орієнтованого програмування, виділені жирним шрифтом у тексті, й порівняти з поданим описом.
Структура програми мовою Java
Мова Java є статично типізованою. Програми на Java утворені з визначень класів та інтерфейсів. Класи містять змінні та сталі, які утримують дані, методи, які виконують дії, та конструктори, які створюють екземпляри класів — об'єкти. Дані можуть мати простий тип (наприклад байт, ціле число, символ) або бути посиланням на об'єкт.
public class Назва{ public static void main (String []args) { тіло функції; } }
Відомий приклад програми мовою Java:
public class HelloWorld { public static void main (String []args) { System.out.println ("Hello, World!"); } }
3. Вивчення нового матеріалу
Подійно-орієнтоване програмування (англійською event-driven programming, далі ПОП) — підхід до програмування, в якому виконання програми визначається подіями — діями користувача (наприклад, з клавіатурою, мишею, джойстиком тощо), повідомленнями інших програм і потоків, подіями операційної системи (наприклад, надходженням мережевого пакета).
ПОП можна також визначити як спосіб побудови комп'ютерної програми, при якому в код описує отримання повідомлення про подію і опрацювання події.
Подійно-орієнтоване програмування, як правило, застосовують у таких трьох випадках:
У сучасних мовах програмування події та обробники подій є центральною ланкою реалізації графічного інтерфейсу користувача. Розглянемо, наприклад, взаємодію програми з подіями, породженими діями з мишею. Натискання правої клавіші миші викликає системне переривання, що запускає певну процедуру всередині операційної системи. У цій процедурі буде проведено пошук вікна, що перебуває під вказівником миші, для того, щоб дану подію надіслати в чергу опрацювання повідомлень цього вікна. Далі, залежно від типу вікна, можуть бути породжені додаткові події. Наприклад, якщо вікно є кнопкою (у Windows всі графічні елементи є вікнами), то додатково буде породжено подію натискання на кнопку. Відмінність останньої події у тому, що вона не містить координат вказівника, а говорить лише про те, що було натиснуто на цю кнопку.
Подія може мати необмежену кількість обробників. При додаванні обробника події його додають до спеціального стеку, а при виникненні події викликають всі обробники за
їхнім порядком у стеці.
Подійно-орієнтоване програмування тісно повязане з поняттям подійно-орієнтованої архітектури, де визначено й саму подію.
Подійно-орієнтована архітектура (англійською Event-driven architecture, EDA) — шаблон архітектури програмного забезпечення, який призначено для створення подій, їх виявлення, споживання і реагування на них.
Розробка застосунків і систем в подійно-орієнтованій архітектурі дозволяє конструювати їх найефективнішим способом.
Подійно-орієнтована архітектура (EDA) може доповнювати сервісно-орієнтовану архітектуру (SOA), бо активування сервісів (служб) має викликатися настанням певних подій. Обчислювальна техніка та сенсорні пристрої (сенсори, датчики, контролери) можуть виявляти зміни стану об'єктів і створювати події, які потім можуть бути опрацьовані сервісом (службою) або системою.
Структура події. Подія може складатися з двох частин: заголовка події та тіла події.
Заголовок події може включати в себе назвe події, часова мітка події і тип події.
Тіло події — це частина, яка описує факт, що стався в дійсності.
Генератор подій виявляє цей факт і подає його подією в рамках виконання програми. Генератором може бути клієнт електронної пошти, система електронної комерції або датчика.
Канал подій — це механізм, через який повідомлення від генератора подій передають до обробника подій (event engine).
Каналом подій може бути з'єднання TCP/IP або вхідний файл будь-якого типу. В один і той самий час може бути відкрито кілька каналів подій, які потрібно зчитувати асинхронно і які зберігають у черзі очікування на опрацювання.
Механізм опрацювання подій (event processing engine) є місцем, де подію ідентифікують і вибирають відповідь на неї.
Примітка. У наступному тексті між двома горизонтальними лініями червоного кольору описано об'єкти керування, властивості яких змінюють у результаті опрацювання подій. Цей матеріал на розсуд вчителя можна вивчати частково або дати на самостійне опрацювання.
Аплет (англійською Applet) — коротка комп'ютерна програма, що функціонально розширює можливості основної програми, або інтернет-застосунку (наприклад, додає на веб-сторінку анімацію). Для створення аплетів використовують (у тому числі) мову програмування Java.
Component — це абстрактний клас, який інкапсулює всі атрибути візуального інтерфейсу — опрацювання введення з клавіатури, керування фокусом, взаємодію з мишею, повідомлення про входження в / вихід з вікна, зміни розмірів і розташування вікон, промальовування свого власного графічного подання, збереження поточного текстового шрифту, кольорів тла й переднього плану.
Підкласи Component:
Container — абстрактний клас, що визначає додаткові методи, які дають можливість поміщати в нього інші складові й будувати ієрархічну систему візуальних об'єктів. Відповідає за розташування вкладених складових за допомогою інтерфейсу LayoutManager (див. далі).
Panel — спеціалізація класу Container. За допомогою методу add в об'єкти Panel можна додавати інші складові. Після цього можна вручну задавати їхнє розташування і змінювати розмір за допомогою методів move, resize і reshape класу Component.
Canvas. Об'єкту Canvas можна надати довільні поведінку й зовнішній вигляд. Його назва означає: клас є порожнім полотном, на якому можна зобразити будь-яку складову. Див. приклад підкласу GrayCanvas, який зафарбовує себе сірим кольором певної насиченості. Аплет створює кілька таких об'єктів, кожен зі своєю інтенсивністю сірого кольору. Ось як цей аплет виглядає на екрані.
Розмір кожного з об'єктів Canvas встановлено на основі значення, отриманого за допомогою методу size, який повертає об'єкт класу Dimension. Зверніть увагу на те, що для розташування об'єктів Canvas у потрібні місця використовують методи resize і move. Такий спосіб стане виснажливим при роботі зі складнішими компонентами й цікавішими варіантами розташування. А наразі в апплеті для виключення згаданого механізму використаний виклик методу setLayout (null).
Label створює напис, тобто виводить текстовий рядок (об'єкт String) з потрібним вирівнюванням. Шрифт і колір тексту є частиною базового визначення класу Component. Для роботи з цими атрибутами передбачено пари методів getFont / setFont і getForeground / setForeground. Задати або змінити текст рядка після створення об'єкта можна за допомогою методу setText. Для встановлення режимів вирівнювання у класі Label визначені три сталі: LEFT, RIGHT і CENTER — див. приклад з трьома написами, кожний — зі своїм режимом вирівнювання.
Button — об'єкт-кнопка, позначений рядком тексту, центрованим усередині кнопки — див. приклад, в якому створено 3 розташовані по вертикалі кнопки. Далі буде описано опрацювання подій, що виникають при натисканні і відпусканні кнопки.
Checkbox — використовують для вибору однієї з двох можливостей. При створенні об'єкта Checkbox йому передають текст мітки й логічне значення, щоб задати початковий стан віконця з відміткою. Програмно можна отримувати і встановлювати стан віконця з відміткою за допомогою методів getState і setState — див. приклад з трьома об'єктами Checkbox, що задається в цьому прикладі початковий стан відповідає позначці у першому об'єкті.
CheckboxGroup. Другий параметр конструктора Checkbox (у попередньому прикладі надано значення null) використовують для групування кількох об'єктів Checkbox. Для цього спочатку створюють об'єкт CheckboxGroup, потім його передають як параметр довільній кількості конструкторів Checkbox. При цьому надані цією групою варіанти вибору стають взаємовиключними: лише один можна задіяти. Передбачено й методи, які дозволяють отримати і встановити групу, до якої належить конкретний об'єкт Checkbox: getCheckboxGroup і setCheckboxGroup. Методи getCurrent і setCurrent можна використати для отримання і встановлення стану обраного у поточний момент об'єкта Checkbox. Поданий приклад відрізняється від попереднього тим, що тепер різні варіанти вибору взаємно виключають один одного.
Choice — використовують при створенні випадних списків. Цей компонент займає саме стільки місця, скільки потрібно, щоб відобразити вибране на поточний момент. При клацанні мишею на компонеті буде розкрито меню з усіма елементами. Кожен елемент меню — це рядок, який виведено при вирівнюванні за лівим краєм. Елементи меню буде виведено у тому порядку, в якому їх було додано в об'єкт Choice. Метод countItems повертає кількість пунктів у меню вибору. Задати обраний пункт можна за допомогою методу select, передавши йому:
Аналогічно, за допомогою методів getSelectedItem і getSelectedIndex можна отримати, відповідно, рядок-мітку і індекс обраного на поточний момент пункту меню — див. приклад, в якому створено два об'єкти Choice.
List — компактний список з можливістю вибору декількох варіантів і з прокруткою — див. приклад, приклад з двома списками вибору, один з яких допускає вибір кількох елементів, а другий - вибір одного елемента.
У нижнього списку є лінійка прокрутки, бо всі його елементи не умістилися в заданий розмір.
Scrollbar — лінійка прокрутки — використовують для вибору підмножини значень між заданими мінімумом і максимумом. Візуально у лінійки прокрутки є кілька органів керування, орієнтованих або вертикально, або горизонтально. Стрілки на кожному з її кінців показують, що, натиснувши на них, можна просунутися на один крок у відповідному напрямку. Поточне положення відображено за допомогою повзунка лінійки прокрутки, яким користувач також може керувати, встановлюючи необхідне положення лінійки.
Конструктор класу Scrollbar дозволяє задавати орієнтацію лінійки прокрутки. Для цього передбачено сталі: VERTICAL і HORIZONTAL. Крім того за допомогою конструктора можна задати початкове положення і розмір повзунка, а так само мінімальне і максимальне значення, в межах яких лінійка прокрутки може змінювати параметр. Для отримання і установки поточного стану лінійки прокрутки використовують методи getValue і setValue. Крім того, скориставшись методами getMinimum і getMaximum, можна отримати робочий діапазон об'єкта — див. приклад, в якому створено й вертикальну, й горизонтальну лінійки прокрутки (для порожньої області).
TextField — однорядкова область для введення тексту. Можна зафіксувати його вміст TextField за допомогою методу setEditable, а метод isEditable повідомить, чи можна редагувати текст у даному об'єкті. Поточне значення тексту можна отримати методом getText і встановити методом setText. За допомогою методу select можна вибрати фрагмент рядка, задаючи його початок і кінець. Для вибору всього рядка використовується метод selectAll. Метод setEchoChar задає символ, який буде виводитися замість будь-яких символів (наприклад, при введенні паролю). Ви можете перевірити, чи перебуває об'єкт TextField в цьому режимі, за допомогою методу echoCharIsSet, і дізнатися, який саме символ заданий для заміни, за допомогою методу getEchoChar — див. приклад, у якому створено класичні поля для імені користувача й пароля.
TextArea — багаторядкова область для введення тексту. У конструкторі вказують число стовпчиків і рядків тексту. Методи для модифікації вмісту об'єкта TextArea:
appendText — додає рядок (тип String) у кінець буфера;
insertText вставляє рядок, починаючи з вказаного номера символу;
rеplaceText замінює на рядок текст, розташований між вказаними з вказаними номерами символів
— див. приклад зі створенням об'єкта TextArea і вставленням рядка у нього.
Примітка. У кожному розглянутому раніше прикладі є виклик методу setLayout(null). Такий виклик забороняє використання передбаченого як усталено механізму керування розміщенням компонентів. Для вирішення цих завдань в AWT передбачено диспетчери розміщення (layout managers). Кожен клас, який реалізує інтерфейс LayoutManager, стежить за списком компонентів, які зберігають як змінні типу String. Кожного разу при додаванні компонент у Panel, диспетчер розташування буде повідомлено про це. Якщо потрібно змінити розмір об'єкта Panel, то має бути звернення до диспетчера за допомогою методів minimumLayoutSize і preferredLayoutSize. У кожному компоненті, який обробляє диспетчер, мають бути реалізації методів preferredSize і minimumSize. Ці методи повинні повертати кращий і мінімальний розміри для промальовування компонента. Диспетчер розміщення по можливості буде намагатися задовольнити ці запити, в той же час піклуючись про цілісність всієї картини взаємного розташування компонентів.
FlowLayout — реалізує простий стиль розташування, при якому компоненти розташовують, починаючи з лівого верхнього кута, зліва направо і зверху вниз. Якщо у рядку немає місця для чергового компонента, його буде розташовано в лівій позиції нового рядка. Компоненти відокремлюють невеликими проміжками. Ширину цього проміжку можна задати в конструкторі FlowLayout. Кожен рядок з компонентами вирівняно за лівим або правим краєм, або центровано залежно від того, яка зі сталих LEFT, RIGHT або CENTER передано конструктору. Як усталено: режим вирівнювання — CENTER, ширина проміжку — 5 пікселів. Див. приклад, в якому в Panel включається декілька компонентів Label. Об'єкт Panel використовує FlowLayout з вирівнюванням RIGHT.
BorderLayout — реалізує звичайний стиль розташування для вікон верхнього рівня, в якому передбачено чотири вузьких компоненти фіксованої ширини по краях, і одна велика область в центрі, яка може розширюватися і звужуватися в двох напрямках, займаючи весь вільний простір вікна. У кожної з цих областей є рядки-назви: String.North, String.South, String.East і String.West — для країв, a Center — для центральної області — див. приклад.
GridLayout — розміщує компоненти у простій рівномірній гратці. Конструктор цього класу дозволяє задавати кількість рядків і стовпчиків — див. приклад, в якому GridLayout використано для створення гратки 4×4, 15 квадратів з 16 заповнено кнопками, поміченими відповідними індексами.
Insets — використовують для того, щоб вставляти в об'єкт Panel межі, що нагадують горизонтальні і вертикальні проміжки між об'єктами, які робить диспетчер розміщення. Для того, щоб домогтися вставки меж в об'єкт Panel, потрібно замістити метод Insets реалізацією, що повертає новий об'єкт Insets з чотирма цілими значеннями, що відповідають ширині верхнього, нижнього, лівого і правого країв.
public Insets insets() {return new Insets(10, 10, 10, 10);}
CardLayout — відрізняється від інших програм керування розміщенням компонентів тим, що подає кілька різних варіантів розташування, які можна порівняти з колодою карт. Колоду можна тасувати так, щоб в даний момент часу нагорі була лише одна з карт. Це може бути корисно при створенні інтерфейсів користувача, в яких є необов'язкові компоненти, вмикати і вимикати динамічно залежно від реакції користувача.
Window — нагадує Panel за тим винятком, що створює своє власне вікно верхнього рівня. Значна частина програмістів використовує не безпосередньо клас Window, а його підклас Frame.
Frame — cаме те, що зазвичай і вважають вікном на робочій поверхні екрану. Є рядок з заголовком, елементи керування для зміни розміру і лінійка меню. Для того, щоб вивести / заховати зображення об'єкта Frame, потрібно використовувати методи show і hide. Див. приклад, який показує об'єкт Frame з TextArea всередині.
MenuBar — лінійка меню — може включати в себе кілька об'єктів Menu. Останні містять у собі список варіантів вибору — об'єктів MenuItem. Menu — підклас MenuItem, тому об'єкти Menu також можуть бути включеними в цей список. Це дозволяє створювати ієрархічно вкладені підменю — див. приклад, у якому до вікна додано декілька вкладених меню.
Всі розглянуті приклади виглядали непогано, але були нефунціональні, бо не передбачали ні опрацювання введення користувача, здійсненого за допомогою елементів керування користувацького інтерфейсу, ні навіть на дії з мишею.
Події, породжені діями з мишею — тип MouseEvent:
Події, породжені діями з клавіатурою — тип KeyEvent:
Код події натискання клавіші — тип int — вказує на те, яку клавішу натиснуто.
Для події е його отримують як значення e.getKeyCode().
Код події для клавіш керування вказівником (зі стрілочками):
Такий самий механізм можна використовувати для керуванням введенням через будь-який з підкласів Component.
Далі у таблиці для кожного елемента пакету AWT перераховано типи подій, які він може породжувати. У першому стовпчику таблиці вказано тип елемента, а в другому — тип відповідної події. Тип події є сталою, яка записують у змінну id об'єкта класу Event. Далі вказано, чи буде передано:
Далі пояснено, що породжує подію і вказано значення, яке буде надано змінної arg об'єкта класу Event. Події, перелічені для елементів класу Component, стосуються до всіх підкласів класу java.awt.Component, а події, перелічені для елементів класу window, стосуються як підкласів класу window, так і класів Dialog і Frame.
Елемент | Тип події (id) | wxykm | Зміст події | Тип і значення arg |
---|---|---|---|---|
Button | ACTION_EVENT | Натиснуто кнопку | String: позначення кнопки | |
Checkbox | ACTION_EVENT | Активовано прапорець | Boolean: новий стан прапорця | |
Choice | ACTION_EVENT | Вибрано елемент списку | String: позначення обраного елемента | |
Element | GOT_FOCUS | Отримання фокусу введення | Не використано | |
Element | KEY_ACTION | wxykm | Натиснуто функціональну клавішу | Не використано, бо key містить назву клавіші |
Element | KEY_ACTION_ RELEASE | wxykm | Відпущено функціональну клавішу | Не використано, бо key містить назву клавіші |
Element | KEY_PRESS | wxykm | Натиснуто клавішу | Не використано, бо key містить ASCII-код клавіші |
Element | KEY_RELEASE | wxykm | Відпущено клавішу | Не використано, бо key містить ASCII-код клавіші |
Element | LOST_FOCUS | Втрата фокусу введення | Не використано | |
Element | MOUSE_ENTER | wxy | Вказівник миші потрапив у область об'єкта класу Component | Не використано |
Element | MOUSE_EXIT | wxy | Вказівник миші вийшов з області об'єкта класу Component | Не використано |
Element | MOUSE_D0WN | wxym | Натиснуто кнопку миші | Не використано |
Element | MOUSE_UP | wxym | Відпущено кнопку миші | Не використано |
Element | MOUSE_MOVE | wxym | Переміщено мишу | Не використано |
Element | MOUSE_DRAG | wxym | Переміщено мишу з утриманням кнопки миші | Не використано |
List | ACTION_EVENT | Подвійне клацання миші на елементі списку | String: позначення обраного елемента | |
List | LIST_SELECT | Вибрано елемент списку | Integer: індекс вибраного елементу | |
List | LIST_DESELECT | Прибрано виділення з певного елемента | Integer: індекс елемента | |
Menu Item | ACTION_EVENT | Вибрано пункт меню | String: позначення вибраного пункту | |
Scrollbar | SCROLL_LINE_UP | Здійснено прокрутку вгору | Integer: позиція, до якої здійснено прокрутку | |
Scrollbar | SCROLL_LINE_DOWN | Здійснено прокрутку вниз | Integer: позиція, до якої здійснено прокрутку | |
Scrollbar | SCROLL_PAGE_UP | Здійснено прокрутку вгору на сторінку | Integer: позиція, до якої здійснено прокрутку | |
Scrollbar | SCROLL_PAGE_DOWN | Здійснено прокрутку вниз на сторінку | Integer: позиція, до якої здійснено прокрутку | |
Scrollbar | SCROLL_ABSOLUTE | Переміщено повзунок смуги прокрутки | Integer: позиція, до якої здійснено прокрутку | |
Text Field | ACTION_EVENT | Ведено текст і натиснуто [Return] | String: введений текст | |
Window | WINDOW_DESTROY | Вікно закрито | Не використано | |
Window | WINDOW_ICONIFY | Вікно представлено у вигляді піктограми | Не використано | |
Window | WINDOW_DEICONIFY | Вікно відновлено | Не використано | |
Window | WINDOW_MOVED | xy | Вікно переміщено | Не використано |
Є відомий приклад, у якому використано модель опрацювання подій Java 1.0. У ньому методи mouseDown і mouseDrag перевизначено таким чином, щоб користувач мав можливість малювати за допомогою миші. Також перевизначено метод keyDown(), щоб при натисканні клавіші С екран було очищено, і метод action, щоб екран було очищено після клацання на кнопці з написов Clear.
Модель опрацювання подій Java 1.1
Нова модель обробки подій є, по суті, модель зворотних викликів (callback). При створенні елемента графічного інтерфейсу користувача описують, який метод або методи цей елемент має викликати при виникненні в ньому певної події. Таку модель легко використати, наприклад, у мові C++, бо ця мова дозволяє оперувати покажчиками на методи. Але в Java це неприпустимо, бо методи не є об'єктами. Тому для реалізації нової моделі необхідно визначити клас, який реалізує деякий спеціальний інтерфейс. Потім можна передати екземпляр такого класу елементу, забезпечуючи таким чином зворотний виклик. Коли настане очікувана подія, елемент викличе відповідний метод об'єкта, визначеного раніше.
Модель опрацюванн подій Java 1.1 використовують як у пакеті AWT, так і в JavaBeans API. У цій моделі різним типам подій відповідають різні класи Java. Кожна подія є підкласом класу java.util.EventObject. Події пакету AWT, які розглянуто в цьому розділі, є підкласом java.awt.AWTEvent. Для зручності події різних типів пакета AWT (наприклад, MouseEvent або АсtionEvent) вкладено в новий пакет java.awt.event.
Кожну подію породжує певний об'єкт, який можна отримати за допомогою методу getSource. Кожній події пакету AWT відповідає певний ідентифікатор, який дозволяє отримати метод getid. Цей параметр використовують для того, щоб відрізняти події різних типів, які описуватися одним і тим же класом подій. Наприклад, для класу FocusEvent можливі два типи подій: FocusEvent.FOCUS_GAINED і FocusEvent.FOCUS_LOST. Підкласи подій містять інформацію, пов'язану з даним типом події. Наприклад, в класі MouseEvent існують методи getX, getY і getClickCount. Цей клас успадковує, серед іншого, й методи getModifiers і getWhen.
Модель опрацювання подій Java 1.1 грунтується на концепції слухача подій — об'єкту, зацікавленого в отриманні даної події. В об'єкті, який породжує подію (у джерелі подій), описано список слухачів, зацікавлених в отриманні повідомлення про те, що дана подія відбулася, і методи, які дозволяють слухачам додавати або видаляти себе з цього списку. Коли джерело породжує подію (або коли об'єкт джерела зареєструє подію, пов'язану з введенням інформації користувачем), він сповіщає всіх слухачів подій про те, що дана подія відбулася.
Джерело події сповіщає об'єкт слухача шляхом виклику спеціального методу і передавання йому об'єкта події (примірника підкласу EventObject). Для того щоб джерело могло викликати даний метод, він повинен бути реалізований для кожного слухача. Наприклад, об'єкти слухачів подій ActionEvent повинні реалізовувати інтерфейс ActionListener. У пакеті Java.awt.event визначені інтерфейси слухачів для кожного з визначених в ньому типів подій. Наприклад, для подій MouseEvent визначено два інтерфейси слухачів: MouseListener і MouseMotionListener. Всі інтерфейси слухачів подій є розширеннями інтерфейсу java.util.EventListener. У цьому інтерфейсі не визначено жодного з методів, але у ньому однозначно визначено всіх слухачів подій як таких.
В інтерфейсі слухача подій можна визначати декілька методів. Наприклад, клас подій, подібний MouseEvent, описує кілька подій, пов'язаних з мишею (натискання і відпускання кнопки миші). Ці події можуть викликати різні методи відповідного слухача. Домовлено: методам слухачів подій передають один аргумент, що містить всі дані, необхідні програмі для формування реакції на подію.
Основні класи подій та опис їх у пакеті Java.awt.event:
ActionEvent — відбувається при натисканні кнопки, подвійному натисканні на елементі списку, або вибору пункту меню;
AdjustmentEvent — відбувається при маніпуляціях з смугою прокрутки;
ComponentEvent — відбувається при приховуванні компонента, його переміщенні, зміні його розміру, або включення видимості;
ContainerEvent — відбувається при додаванні або виключенні компонента контейнера;
FocusEvent — відбувається, коли компонент отримує або втрачає фокус клавіатурного введення;
InputEvent — абстрактний суперклас для всіх класів подій введення компонентів;
ItemEvent — відбувається, коли помічено прапорець або елемент списку, зроблено вибір елемента у списку вибору, обрано / відмінено елемент меню з міткою;
KeyEvent — відбувається, коли отримано введення з клавіатури;
MouseEvent — відбувається, коли об’єкт перетягується (dragged) або пересувається (moved), відбулося клацання (clicked), натиснуто (pressed) або відпущено (released) кнопку миші, коли покажчик миші входить або виходить у (поза) межі компонента;
TextEvent — відбувається, коли змінено значення текстової області або текстового поля;
WindowEvent — відбувається, коли вікно активовано, закрито, дезактивовано, розгорнуто або згорнуто, відкрито або відбувся вихід (exit) з нього.
Клас події | Інтерфейс слухача | Методи слухача |
---|---|---|
ActionEvent | ActionListener | actionPerformed |
AdjustmentEvent | AdjustmentListener | adjustmentValueChanged |
ComponentEvent | ComponentListener | componentHidden componentMoved componentResized componentShown |
ContainerEvent | ContainerListener | componentAdded componentRemoved |
FocusEvent | FocusListener | focusGained focusLost |
ItemEvent | ItemListener | itemStateChanged |
KeyEvent | KeyListener | keyPressed keyReleased keyTyped |
MouseEvent | MouseListener | mouseClicked mouseEntered mouseExited mousePressed mouseReleased |
MouseEvent | MouseMotionListener | mouseDragged mouseMoved |
TextEvent | TextListener | textValueChanged |
WindowEvent | WindowListener | windowActivated windowClosed windowClosing windowDeactivated windowDeiconified windowlconified windowOpened |
Для кожного інтерфейсу слухачів подій, що містить кілька методів, в пакеті java.awt.event визначено простий клас-адаптер, який забезпечує порожнє тіло для кожного з методів відповідного інтерфейсу. Коли потрібен лише один чи два таких методи, простіше описати підклас класу-адаптера, ніж реалізувати інтерфейс самостійно. В описі підкласу адаптера потрібно лише перевизначити ті методи, які потрібні, а при прямій реалізації інтерфейсу необхідно визначити всі методи, в тому числі й непотрібні в даній програмі. Наперед визначені класи-адаптери називають так само, як і інтерфейси, які вони реалізують. Але в цих назвах Listener замінено на Adapter: MouseAdapter, WindowAdapter тощо.
Після реалізації інтерфейсу слухача або отримання підкласу класу-адаптера необхідно створити екземпляр нового класу, щоб визначити конкретний об'єкт слухача подій. Потім цього слухача має зареєстровати відповідне джерелом подій. У програмах пакета AWT джерелом подій завжди є який-небудь елемент пакета. У методах реєстрації слухачів подій використовують стандартні домовленості щодо назв: якщо джерело подій породжує події типу X, в ньому існує метод addXListener для додавання слухача і метод removeXListener для його видалення. Однією з приємних особливостей моделі обробки подій Java 1.1 є можливість легко визначати типи подій, які може породжувати даний елемент. Для цього потрібно лише переглянути, які методи зареєстровано для його слухача подій. Наприклад, з опису API для об'єкта класу Button випливає, що він породжує події ActionEvent. У наступній таблиці подано список елементів пакету AWT і подій, які вони породжують.
Елемент | Породжена подія | Зміст |
---|---|---|
Button | ActionEvent | Натиснуто кнопку |
CheckBox | ItemEvent | Встановлено або скинуто прапорець |
CheckBoxMenuItem | ItemEvent | Встановлено або скинуто прапорець меню |
Choice | ItemEvent | Вибрано елемент списку або скасовано його вибір |
Component | ComponentEvent | Елемент або переміщено, або він став прихованим, або видимим |
FocusEvent | Елемент отримав або втратив фокус введення | |
KeyEvent | Натиснуто або відпущено клавішу | |
MouseEvent | Натиснуто або відпущено кнопку миші, або вказівник миші увійшов чи покинув область, зайняту елементом, або переміщено мишу (з утриманням кнопки чи без) | |
Container | ContainerEvent | Елемент додано в контейнер або видалено з нього |
List | ActionEvent | Подвійне клацання миші на елементі списку |
ItemEvent | Вибрано елемент списку або скасувано такий вибір | |
MenuItem | ActionEvent | Вибрано пункт меню |
Scrollbar | AdjustmentEvent | Здійснено прокрутку |
TextComponent | TextEvent | Внесено зміни у текст елемента |
TextField | ActionEvent | Закінчено редагування тексту елемента |
Window | WindowEvent | Вікно було відкрито, закрито, представлено піктограмою, відновлено або вимагає відновлення |
Модель опрацювання подій Java 1.1 є доволі гнучкою і надає користувачеві ряд можливостей для структурування програми опрацювання подій. Перший з цих способів продемонстровано у наступному прикладі, у якому реалізовані інтерфейси MouseListener і MouseMotionListener реєструють себе за допомогою своїх методів addMouseListener і addMouseMotionListener. Як і у попередньому випадку, можна залишати слід від вказівника миші, натискаючи ліву кнопку миші (див. приклад такого сліду нижче праворуч.
Модель опрацювання подій Java 1.1 розроблено з урахуванням того, щоб добре поєднуватися з іншого новою особливістю Java 1.1: вбудованими класами. У наступному прикладі, показано, яких змін зазнає код, якщо слухачі подій буде реалізовано за допомогою анонімних вбудованих класів. Зверніть увагу на компактність коду. Додано кнопку Clear, для якої зареєстровано об'єкт ActionListener, а сама вона виконує очищення екрану при настанні відповідної події.
Розглянемо приклад програми, що ілюструє можливості Java щодо створення користувацького інтерфейсу та опрацювання подій. У двох текстових полях вводять по одному числу. Після натискання на кнопку Check буде перевірено, чи не є перше число з них квадратом іншого, і виведено відповідь на екран.
Прокоментуємо цю програму.
Спочатку потрібно імпортувати пакети:
java.awt — з описом класів, що визначають елементи інтерфейсу користувача;
java.awt.event — з описом класів опрацювання подій.
Головний клас Square (текст програми повинен мати назву Square.java) є нащадком класу Frame. Це має такі наслідки:
клас Frame має візуальний еквівалент у вигляді вікна;
це вікно вміє реагувати на деякі події миші, змінюючи розміри та розташування положення на екрані, згортатися та розгортатися. Але його так просто не закриєш, тобто цьому його потрібно навчити;
клас Frame, як нащадок класу Container, дозволяє вставляти в себе елементи користувацького інтерфейсу (кнопки, поля введення тощо), з якими буде безпосередньо працювати оператор.
Клас Square успадковує всі ці візуальні та функціональні властивості від класу Frame як його безпосередній нащадок.
Клас Square реалізує інтерфейс ActionListener, що містить метод actionPerformed, на який передається керування при натисканні кнопки. Тому всі дії, пов’язані з перевіркою співвідношення між числами, буде описано саме в цьому методі.
Опис класу починають з оголошення змінних. Ці змінні (поля класу) будуть досяжними з будь-якого методу класу. Вони відповідають основним елементам користувацького інтерфейсу: полям введення чисел і кнопці Check. Змінну displayStr призначено для виведення відповіді. Може виникнути питання: чому серед цих елементів ми не бачимо надписів (Label). Їх можна було б описати тут, зробивши глобальними. Але їх використано лише в одному місці й описано нижче в конструкторі класу.
Конструктор починають з виклику конструктору суперкласу. Для звертання до батьківського класу у мові Java використовують назву вказівку super. Отже, вираз
super("Check Square");
означає звертання до конструктора класу Frame. Як параметр йому передано рядок — заголовок вікна.
Метод setSize встановлює розміри вікна. У попередніх версіях Java для цього використовували метод resize.
Наступний крок — вибір класу розкладки для управління розташуванням елементів користувацького інтерфейсу. Обрано найпростіше послідовне розташування. Це означає, що елементи буде розташовано послідовно зліва направо та згори донизу. Після цього можна перейти безпосередньо до створення елементів і вставляння їх в контейнер за допомогою метода add. При створенні кнопки button1 одразу за допомогою методу addActionListener зареєстровано блок прослуховування події. Це необхідно для того, щоб відповідний метод отримав керування при натисненні кнопки. Інший підхід, який базується на використанні адаптера WindowAdapter ми застосуємо для опрацювання події закриття вікна для завершення роботи програми. Наприкінці конструктора за допомогою метода show виведено на екран вікно програми разом з усіма створеними (описаними) елементами користувацького інтерфейсу.
Метод main дуже простий: у ньому створено клас програми за допомогою конструктора Square. Якщо завершити процес розробки програми на цьому місці, скомпілювати її та виконати, побачимо вікно, подане малюнком безпосередньо перед коментарем до програми. Зрозуміло, що необхідна функціональність поки що відсутня, але зовнішній вигляд програми вже цілком відповідає умовам задачі.
Наступний метод actionPerformed викликають натисканням на кнопку. Як параметр йому передано об’єкт evt класу ActionEvent, який несе повну інформацію про подію, що відбулася. Спочатку за допомогою методу getActionCommand отримано рядок, що містить інформацію про джерело події. В цей момент arg дорівнює "Check". Далі за допомогою методу equals класу String буде перевірено, чи дійсно натиснено саме кнопку "Check", а не іншу. Буде отримано інформацію з текстових полів: спочатку за допомогою методу getText у вигляді рядка, а потім за допомогою статичного методу parseInt класу Integer — у вигляді цілого числа. Далі формується відповідь — рядок displayStr. Для його виведення на екран слугує метод paint. Метод paint напряму не викликано. Якщо необхідно оновити інформацію у вікні, програма викликає метод repaint, а вже він передає керування методу paint.
Такий спосіб виведення використано винятково з метою ознайомлення з різними можливостями щодо виведення інформації. Простіше це зробити, виводячи відповідь у третє текстове поле.
4. Інструктаж з ТБ
5. Закріплення вивченного матеріалу
Проаналізувати код порядково.
Створити проєкт work, у якому файл Work.java містить розглянутий код. Скористатися описом алгоритму створення проєкту для середовища Eclipse чи Netbeans (з точністю до назв пакунку і класу).
Перевірити правильність дії програми, натискаючи на клавіші, переміщаючи мишку та натискаючи на кнопки миші під час роботи програми. Пересвідчитися, що у консоль буде виведено відповідні повідомлення.
Пересвідчитися у можливості модифікації програми, замінивши у переозначенні обробника події (на вибір учня) виведення рядка тексту у консоль на створення нового вікна:
Graphtest g = new Graphtest("");
Перевірити появу нового вікна після відповідної породження певної події, перетягуючи новосворене вікно праворуч від розташування початкового вікна.
6. Підбиття підсумків уроку
7. Домашнє завдання
Повторити матеріал уроку.
Скласти програму, що відстежуватиме клацання лівою кнопкою миші у своєму вікні й відображатиме біля вказівника миші його координати у квадратних дужках. При потребі див. детальні інструкції й пояснення.
Порівняти з демонстраційним розв'язанням.
Текст упорядкував Роздобудько Василь Васильович, вчитель інформатики середньої загальноосвітньої школи І–ІІІ ступенів № 66 Дніпровського району міста Києва, під час виконання випускної роботи на курсах підвищення кваліфікації з 24.10.2016 по 28.10.2016.
У роботі використано матеріали, опубліковані на сторінках 16 і 17 розділу сайту helloworld.ru, присвяченому мові Java.