Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторна робота_ТА6

.pdf
Скачиваний:
9
Добавлен:
16.02.2016
Размер:
178.22 Кб
Скачать

Лабораторна робота № 6 Тема роботи: Обробка подій в мові Java

Мета роботи: ознайомитись з особливостями створення та обробки подій в мові програмування Java.

Підготовка до заняття

1. Вивчити відповідні розділи теоретичної частини та відповідного лекційно го курсу.

Теоретичні відомості

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

На чолі ієрархії класів-подій стоїть клас Eventobject із пакета java.util — безпосереднє розширення класу Object. Його розширяє абстрактний клас AWTEvent із пакета java.awt — глава класів, описуючих події бібліотеки AWT. Подальша ієрархія класів-подій показана на рис. 1. Всі класи, відображені на рисунку, крім класу AWTEvent, зібрані в пакет java.awt.event. Події типу ComponentEvent, FосusEvent, KeyEvent, MouseEvent виникають у всіх компонентах. А події типу ContainerEvent — тільки в контейнерах: Container, Dialog, FileDialog, Frame, Panel, Scroll Pane, Window.

Рис. 1

Події типу WindowEvent виникають тільки у вікнах: Frame, Dialog, FileDialog, Window. Події типу TextEvent генеруються тільки в контейнерах Textcomponent, TextArea, TextField. Події типу ActionEvent проявляються тільки в контейнерах Button, List, TextField.

Події типу ItemEvent виникають тільки в контейнерах Checkbox, Choice, List. Нарешті, події типу AdjustmentEvent виникають тільки в контейнері Scrollbar.

Взнати, в якому об’єкті відбулася подія, можна методом getSource() класу Eventobject. Цей метод повертає тип Оbject. В кожному з цих класів-подій визначений метод paramstring(), повертаючий вміст об’єкта даного класу у вигляді рядка String. Крім того, в кожному класі є свої методи, посталяючі ті чи інші відомості п ро події. Зокрема, метод getio() повертає ідентифікатор

(identifier) події — ціле число, що означає тип події. Ідентифікатори події визначені в кожному класі-події як константи.

Методи обробки подій описані в інтерфейсах -слухачах (listener). Для кожного показаного на рис.1 типу подій, крім inputEvent (ця подія рідко використовується самостійно), є свій інтерфейс. Імена інтерфейсів складаються із імені події і слова Listener, наприклад, ActionListener, MouseListener. Методи інтерфейсу "слухають", що відбувається в потенційному джерелі події. При виникненні події ці методи автоматично виконуються, одержуючи в якості аргумент у об’єктподію і використовуючи при обробці відомості про події, що містяться в цьому об ’єкті.

Щоб задати обробку події певного типу, тр еба реалізувати відповідний інтерфейс. Класи, реалізуючі такий інтерфейс, класи -оброблювачі (handlers) події, називаются слухачами (listeners): вони "слухають", що відбувається в об ’єкті, щоб відслідкувати виникнення події і опрацювати її. Щоб зв’язатися з обробником події, класи-джерела події повинні отримати посилку на екземпляр eventHandІer класу-обробника події одним із методів addXxxListener(XxxEvent eventHandier) , де Ххх — ім’я події. Такий спосіб реєстрації, при якому слухач залишає "візитну карточку " джерелу для свого виклику при виникненні події, називається зворотний виклик (callback).

Зворотна дія — відмова від обробника, переривання прослуховування — виконується методом removeXxxListener(). Таким чином, компонент-джерело, в якому відбулася подія , не займається його обробкою. Він звертається до екземпляра класу-слухача, вміючого обробляти події, делегує (delegate) йому повноваження по обробці.

Така схема отримала назву схеми делегування (delegation). Вона зручна тим, що ми можемо легко змінити клас-обробник і опрацювати подію по-іншому або призначити декілька оброблювачів однієї й тієї ж події. З іншого боку, ми можемо один оброблювач призначити на прослуховування декількох об’єктів-джерел подій. Ця схема здається занадто складною, але ми нею часто користуємося в житті. Допустимо, ми вирішили облаштувати квартиру. Ми поміщаємо в неї, як в контейнер, різні компоненти: меблі, сантехніку, електроніку, антикваріат. Ми вважаємо, що може відбутися неприємна подія — квартиру відвідають грабіжники, — і хочемо її опрацювати. Ми знаємо, что класи -оброблювачі цієї події — охоронні агентства, — і звертаємося до деякого экземпляра такого класу. Компоненти -джерела події, тобто речі, які можуть бути украдені, приєднують до себе датчики методом addXxxListener(). Потім екземпляр-оброблювач "слухає", що відбувається в об’єктах, до яких він підключений. Він реагує на виникнення тільки однієї події — викрадення прослуховуваного об ’єкта, — інші події, наприклад, коротке замикання або прорив водопровідної труби, його не ц ікавлять. При виникненні "своєї" події він діє по контракту, записаному в методі опрацювання.

Обробка дій миші

Подія MouseEvent виникає в компоненті по одній із семи причин:натискання кнопки миші — ідентифікатор MOUSE_PRESSED;

відпускання кнопки миші — ідентифікатор MOUSE_RELEASED;

клік кнопкою миші — ідентифікатор MOUSE_CLICKED (натискання і відпускання не відрізняються);

переміщення миші — ідентифікатор MOUSE_MOVED;

переміщення миші з натисненою кнопкою — ідентифікатор MOUSE_DRAGGED;

поява курсору миші в компоненті — ідентифікатор MOUSE_ENTERED;

вихід курсору миші із компонента — ідентифікатор MOUSE_EXITED.

Для їх обробки є сім методів у двох інтерфейсах:

public interface MouseListener extends EventListener{ public void mouseClicked(MouseEvent e);

public void mousePressed(MouseEvent e) ; public void mouseReleased(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e);

}

public interface MouseMotionListener extends EventListener{ public void mouseDragged(MouseEvent e);

public void mouseMoved(MouseEvent e);

}

Ці методи можуть одержати від аргумент у е координати курсору миші в системі координат компонента методами e.getx(), e.getv(), або одним методом e.getPoint(), повертаючим екземпляр класу Point. Подвійний клік кнопкою миші можна відслідкувати методом e.getСІickСount(), повертаючим кількість кліків. При переміщенні миші повертається 0. Взнати, яка кнопка була натиснута, можна за допомогою методу e.getModifiers() класу inputEvent порівнянням з наступими статичними константами класу inputEvent:

BUTTON1_MASK — натиснута перша кнопка, звичайно ліва;

BUTTON2_MASK — натиснута друга кнопка, звичайно середня, або одночасно обидві кнопки на двохкнопковій миші;

BUTTON3_MASK — натиснута третья кнопка, звичайно права.

Обробка дій клавіатури

Подія KeyEvent відбувається в компоненті по будь-якій із трьох причин:

натиснута клавіша — ідентифікатор KEY_PRESSED;

відпущена клавіша — ідентифікатор KEY_RELEASED;

введений символ — ідентифікатор KEY_TYPED.

Остання подія виникає із-за того, що деякі символи вводяться натисканням декількох клавіш, наприклад, заглавні літери вводяться комбінацією клавіш <Shift>+<літера>. Згадайте ще <Аlt>- введення в MS Windows. Натискання функціональних клавіш, наприклад <F1>, не викликає подію KEY_TYPED. Обробляються ці події трьома методами, описаними в інтерфейсі:

public interface KeyListener extends EventListener{ public void keyTyped(KeyEvent e);

public void keyPressed(KeyEvent e); public void keyReleased(KeyEvent e);

}

Метод e.getKeyChar() повертає символ Unicode типу char, зв’язаний з клавішею. Якщо з клавішею не зв’язаний ніякий символ, то повертається константа CHAR_UNDEFINED.

Метод e. getKeyCode () повертає код клавіші у вигляді цілого числа типу int.

В класі KeyEvent визначені коди всіх клавіш у вигляді констант, названих віртуальними кодами клавіш (virtual key codes), наприклад, VK_FI, VK_SHIFT, VK_A, VK_B, VK_PLUS . Вони перечислені в документації до класу KeyEvent. Фактичне значення віртуального коду залежить від мови і розкладки клавіатури. Щоб узнати, яка клавіша була натиснута, треба порівняти результат виконання методу getKeyCode() з цими константами. Якщо коду клавіші немає, як відбувається при настанні події KEY_TYPED, то повертається значення VK_UNDEFINED. Щоб узнати, чи не натиснута одна або декілька клавіш -модифікаторів <Alt>, <Ctrl>, <Meta>, <Shift>, треба скористатися наслідуваним від класу inputEvent методом getModifiers() і порівняти його результат з константами ALT_MASK, CTRL_MASK, META_MASK, SHIFT_MASK . Другий спосіб — застосувати логічні методи isAltDown(), isControlDown(), isMetaDown(), isShiftDown() .

Створення меню

В контейнер типу Frame закладена можливість установки стандартного рядка меню (menu bar), розташованого нижче рядка заголовка, як показано на рис. 13.1. Цей рядок – об’єкт класу MenuBar. Все, що потрібно зробити для установки рядка меню в контейнері Frame - це створити обєкт класу MenuBar і звернутися до методу setMenuBar():

Frame f = new Frame("Приклад меню"); MenuBar mb = new MenuBar(); f.setMenuBar(mb);

Якщо ім’я mb не знадобиться, можна сумістить два останніх звернення до методів:

f.setMenuBar(new MenuBar());

Розуміється, рядок меню ще пустий й п ункти меню не створені. Кожний е лемент рядка меню - випадаюче меню (drop-down menu ) - це об’єкт класу Menu. Створити ці об’єкти і занести їх в рядок меню не складніше, ніж створити рядок меню:

Menu mFile = new Menu("Файл"); mb.add(mFile);

Menu mEdit = new Menu("Правка"); mb.add(mEdit);

Menu mView = new Menu("Вид"); mb.add(mView);

Menu mHelp = new Menu("Справка"); mb.setHelpMenu(mHelp);

і т. д. Елементи розташовуються зліва направо в порядку звернень до методів add(), як показано на рис. 2. В багатьох графічних системах прийнято меню Справка ( Help) притискати до правого краю рядка меню. Це досягається зверненням до методу setHeІpMenu(), але фактичне положення меню Справка визначається графічною оболонкою.

Рис. 2 Потім визначаємо кожне випадаюче меню, створюючи його пункти. Кожний пункт меню —

це обєкт класу MenuІtem. Схема його створення і додавання до меню точно т ака ж, як і самого меню:

MenuІtem create = new Menuitem("Створити"); mFile.add(create);

MenuІtem open = new Menuitem("Відкрити..."); mFile.add(open);

Пункти меню будуть розташовані зверху вниз в порядку звернення до методів add(). Часто пункти меню об’єднуються в групи. Одна група від іншої відокремлюється горизонтальною рискою. На рис. 2 риска проведена між командами Відкрити і Відправити. Ця риска створюється методом addSeparator() класу Menu або визначається як пункт меню з написом спеціального ви ду

— дефісом:

mFile.addfnew Menuitem(" -"));

Клас Menu розширює клас MenuІtem, а не навпаки. Це означає, що меню само являється пунктом меню, і дозволяє задавати меню в якості пункту іншого меню, тим самим організ уючи вкладені підменю:

Menu send = new Menu("Відправити"); mFile.add(send);

Тут меню send додається в меню mFile як один із його пунктів. Підменю send заповняється пунктами меню як звичайне меню. Часто команди меню створюються для вибору із них певних можливостей, подібно компонентам Сheckbox. Такі пункти можна виділити кліком кнопки миші або відмінити виділення повторним кліком. Ці команди — об’єкти класу CheckboxMenuItem:

CheckboxMenuItem disk = new CheckboxMenuItem("Диск A:", true); send.add(disk);

send.add(new CheckboxMenuItem("Архів")) ;

Деякі графічні оболонки, але не MS Windows, дозволяють створювати відокремлювані (tearoff) меню, які можна переміщати по екрану. Це вказується в конструкторі:

Menu(String label, boolean tearOff)

Якщо tearoff == true і графічна оболочка уміє сстворюв ати відокремлюване меню, то воно буде створено. В протилежному випадку цей аргумент просто ігнорується.

Нарешті, треба призначити дії командам меню. Команди меню типу MenuІtem породжують події типу ActionEvent, тому потрібно приєднати до них об ’єкт класу-слухача як до звичайних компонентів, записавши:

create.addActionListener(new SomeActionEventHandler()) open.addActionListener(new AnotherActionEventHandler())

Пункти типу CheckboxMenuItem породжують події типу ItemEvent, тому треба звертатися до об’єкту-слухача цієї події:

disk.addltemListener(new SomeltemEventHandler())

Дуже часто дії, записані в командах меню, викликаються не тільки кліком кнопки миші, але і "гарячими" клавішами-акселераторами (shortcut), діючими частіше всього при натисканні клавіш і <Ctrl>. На екрані в пунктах меню, яким призначені "гарячі" клавіші, появляються підказки виду Ctrl+N, Ctrl+O, як на рис. 2. "Гаряча" клавіша визначається об ’єктом класу MenuShortcut і вказується в його конструкторі константою класу KeyEvent, наприклад:

MenuShortcut keyCreate = new MenuShortcut(KeyEvent.VK_N);

Після цього "гарячою" буде комбінація клавіш <Ctrl>+<N>. Потім отриманий обєкт указується в конструкторі класу MenuІtem:

Menuitem create = new Menuitem("Створити", keyCreate);

Натискання <Ctrl>+<N> буде викликати вікно створення. Ці дії, зрозу міло, можна сумістити, наприклад:

Menuitem open = new Menultern("Відкрити...", new -MenuShortcut(KeyEvent.VK_O));

Можна додати ще натискання клавіші <Shift>. Дія пункту меню буде викликатися натисканням комбінації клавіш <Shift>+<Ctrl>+<X>, якщо скористуватися другим конструктором:

MenuShortcut(int key, boolean useShift) з аргументом useShift == true

Порядок виконання роботи

1.Запустіть NetBeans IDE 6.9.1.

2.У вікні, що відкрилось виберіть Файл\Создать проект.

Відкриється вікно створення нового проекту. В ньому виберіть категорію проекту Java, а у вікні Проекты Приложение Java та натисніть клавішу Далее.

3.Задайте ім’я Java-проекту та виберіть папку для його збереження.

Вполі Имя проекта задайте назву за наступним зразком: My + Прізвище студента латиницею5. Наприклад: MyIvanov6.

Вполі Расположение проекта виберіть диск, на якому розміщена Ваша робоча директорія (для цього скористайтесь клавішею Обзор…).

Для збереження введених змін натисніть на клавішу Завершить.

4.Створіть в Вашому проекті новий клас My + Прізвище студента латиницею (наприклад,

MyIvanov).

Для цього натисніть правою клавішею миші (ПКМ) на назві пакету myivanov6 та в меню, що відкрилось виберіть: Создать\Класс Java (рис. 3).

Рис. 3

В вікні, що відкриється введіть ім’я класу та для остаточного примінення змін натисніть клавішу Завершить.

Перед Вами з’явиться вікно редагування файлу MyIvanov.Java.

5.Cтворіть віконний інтерфейс.

Для цього в створеному класі MyIvanov потрібно задати новий клас з розширенням JFrame з вказанням повного шляху до Swing -бібліотек, де знаходиться клас JFrame. Після цього необхідно написати параметризований конструктор класу, для відображення вікна розміром 800х600 з стандартними кнопками управління (Мінімізувати, Згор нути, Закрити) (рис. 4).

Рис. 4

super (str); - відповідає за виведення назви вікна, що, як прописано раніше, матиме стрічковий тип представлення;

setSize(800,600); - метод, що відповідає за задання розмірів вікна в пікселях; setVisible(true); - метод, що відповідає за видимість (чи невидимість, якщо значення false)

створюваного нами вікна.

6.Пропишіть посилання на створений нами клас MyIvanov в головному методі main.

Для цього переходимо в клас Main, компонента Main.java та прописуємо там наступний

рядок (рис. 4):

Рис. 4

7. Згідно запропонованого в додатку до лабораторної роботи лістингу створіть в класі MyIvanov програму для здійснення малювання мишкою в віконному інтерфейсі (рис. 5)

Програма дозволяє малювати чотирма кольорами (червоним, зеленим, синім та чорним), та містить опцію автоматичної очистки екрану. Колір можна вибирати натисненням відповідної кнопки у вікні екрану чи з меню Малювати\Колір.

Програма містить меню, що розгортається, деякі підпункти якого запрограмовані на натиснення комбінацій клавіш (Відкрити => Ctrl+0, Вихід =>Ctrl+Q тощо).

Необхідні матеріал по створенню елементів програмного продукту Ви можете знайти у теоретичних відомостях до виконання лабораторної роботи.

Рис. 5

8.Здійсніть перевірку працездатності програми (при необхідн ості виправте помилки та доопрацюйте).

Загальний вигляд програми представлений на рис. 13. Лістинг коду MyIvanov.java представлений у Додаток А.

9. Представте електронний варіант лабораторної роботи викладачеві для звітності.

3 Вимоги до оформлення звіту

1. Оформити звіт з зазначенням висновків та захистити роботу (знання використаних у роботі елементів коду Java).

ЛІТЕРАТУРА

1.Нотон П. JAVA: Справ.руководство: Пер.с англ. / Под ред. А.Тихонова. – М.:БИНОМ: Восточ. Кн. Компания,1996: Восточ. Кн. Компания. – 447с.

2.Программирование на Java / Вязовик Н.А. / М.: ИНТУИТ.РУ «Интернет -университет Информационных Технологий», 2003. – 592 с.

3.Баженова И.Ю. Язык программирования Java . – АО «Диалог-МИФИ», 1997.

4.Философия Java. Библиотека программиста. 4 -е изд. – СПб.: Питер, 2009. – 640 с.

5.Нейл Бартлетт, Алекс Лесли, Стив Симкин. Программирование на Java. Путеводитель .- The Coriolis Group,Inc.,1996, Издательство НИПФ «ДиаСофт Лтд.», 1996.

Додаток А

Лістинг коду документа MyIvanov.java