Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Програмування у Java
Урок 8. Принципи побудови графічного інтерфейса
Класи використовувані в цьому уроці:
Button
Canvas
Checkbox
CheckboxMenuItem
Choice
Color
Component
Container
Frame
Graphics
Label
List
Menu
Menubar
Menultem
PopupMenu
Scrollbar
TextArea
TextField
Для вашої зручності описання цих класів поміщено в папку Java 8
8.1. Важкі і легкі компоненти
В попередніх уроках ми писали програми, звязані з текстовим терміналом і запускали їх із командного рядка. Такі програми називаються консольними додатками. Вони розробляються для виконання на серверах, там, де не потрібний інтерактивний звязок з користувачем. Програми, тісно взаємодіючі з користувачем, сприймаючі сигнали від клавіатури і миші, працюють в графічному середовищі. Кожний додаток, призначений для роботи в графічному середовищі, повинен створити хоча б одне вікно, в якому буде виконуватися його робота, і зареєструвати його в графічній оболонці операційної системи, щоб вікно могло взаємодіяти з операційною системою і іншими вікнами: перекриватися, переміщатися, змінювати розміри, звертатися в ярлик.
Єсть багато різних графічних систем: MS Windows, X Window System, Macintosh. В кожній з них свої правила побудови вікон і їх компонентів: меню, полів введення, кнопок, списків, смуг прокрутки. Ці правила складні і заплутані. Графічні API містять сотні функцій. Для полегшення створення вікон і їх компонентів написані бібліотеки класів: MFC, Motif, OpenLook, Qt, Tk, Xview, OpenWindows і багато інших. Кожний клас такої бібліотеки описує зразу цілий графічний компонент, що управляється методами цього і інших класів.
В технології Java справа ускладюється тим, що додатки Java повинні працювати в будь-якому або хоча б в багатьох графічних середовищах. Потрібна бібліотека класів, незалежна від конкретної графічної системи. В першій версії JDK задачу вирішили наступним способом: були розроблені інтерфейси, що містили методи роботи з графічними обєктами. Класи бібліотеки AWT реалізують ці інтерфейси для створення додатків. Додатки Java використовують дані методи для розміщення і переміщення графічних обєктів, зміни їх розмірів, взаємодії обєктів.
З другого боку, для роботи з екраном в конкретному графічному середовищі ці інтерфейси реалізуються в кожному такому середовищі окремо. В кожній графічній оболонці це робиться по-своєму, засобами цієї оболонки за допомогою графічних бібліотек даної операційної системи. Такі інтерфейси були названі peer-інтерфейсами. Бібліотека класів Java, основаних на peer-інтерфейсах, отримала назву AWT (Abstract Window Toolkit). При виведенні обєкта, створеного в додатку Java і основаного на peer-інтерфейсі, на екран створюється парний йому (peer-to-peer) обєкт графічної підсистеми операційної системи, котрий і відображається на екрані. Ці обєкти тісно взаємодіють під час роботи додатку. Тому графічні обєкти AWT в кожному графічному середовищі мають вигляд, характерний для цього середовища: в MS Windows, Motif, OpenLook, OpenWindows, скрізь вікна, створені в AWT, виглядають як "рідні" вікна. Якраз із-за такої реалізації peer-інтерфейсів і інших "рідних" методів, написаних, головним чином, на мові C++, приходиться для кожної платформи випускати свій варіант JDK.
У версії JDK 1.1 бібліотека AWT була перероблена. В неї додана можливість створення компонентів, повністю написаних на Java і не залежних від peer-інтерфейсів. Такі компоненти стали називати "легкими" (lightweight) на відміну від компонентів, реалізованих через peer-інтерфейси, названих "важкими" (heavy).
"Легкі" компоненти скрізь виглядають однаково, зберігаючи заданий при створенні вигляд (look and feel). Білше того, додаток можна розробити таким способом, щоб після його запуску можна було вибрати якийсь певний вигляд: Motif, Metal, Windows 95 або якийсь інший, і змінити цей вигляд в будь-який момент роботи. Ця цікава особливість "легких" компонентів отримала назву PL&F (Pluggable Look and Feel) або plaf. Була створена обширна бібліотека "легких" компонентів Java, названа Swing. В ній були переписані всі компоненти бібліотеки AWT, так що бібліотека Swing може використовуватися самостійно, незважаючи на те, що всі класи з неї розширяють класи бібліотеки AWT. Бібліотека класів Swing поставлялась як доповнення до JDK 1.1.
Інтерфейс
(набір оголошених, але не реалізованих
методів)
peer-interfaces
Реалізація методами Реалізація методами
конкретної платформи Java
Heavy Componetnts (classes) Light Components (classes)
AWT Swing
В склад Java 2 SDK вона включена як основна графічна бібліотека класів, реалізуюча ідею "100% Pure Java", поряд з AWT. В Java 2 бібліотека AWT значно розширена доданням нових засобів рисування, виведення текстів і зображень, одержавших назву Java 2D, і засобів, реалізуючих переміщення тексту методом DnD (Drag and Drop). Крім того, в Java 2 включені нові методи введення/виведення Input Method Framework і засоби звязку з додатковими пристроями введення/виведення, такими як світлове перо або клавіатура Бройля, названі Accessibility. Всі ці засоби Java 2: AWT, Swing, Java 2D, DnD, Input Method Framework і Accessibility склали бібліотеку графічних засобів Java, названу JFC (Java Foundation Classes).
Опис кожного з цих засобів займе цілу книгу, тому ми обмежимося представленням тільки основних засобів бібліотеки AWT.
8.2. Компонент і контейнер
Основне поняття графічного інтерфейса користувача (ГІК) компонент (component) графічної системи. В українській мові це слово підрозуміває просто складову частину, елемент чого-небудь, але в графічному інтерфейсі це поняття більш конкретне. Воно означає окремий, повністю визначений елемент, котрий можна використовувати в графічному інтерфейсі незалежно від інших елементів. Наприклад, це поле введення, кнопка, рядок меню, смуга прокрутки, радіокнопка. Саме вікно додатку теж є компонент. Компоненти можуть бути і невидимими, наприклад, панель, обєднуюча компоненти, також являється компонентом.
Ви не здивуєтесь, узнавши, що в AWT компонентом вважається обєкт класу Component або обєкт всякого класу, розширяючого клас Сomponent. В класі Сomponent зібрані загальні методи роботи з будь-яким компонентом графічного інтерфейса користувача. Цей клас центр бібліотеки AWT. Ознайомтеся з цим класом. Кожний компонент перед виведенням на екран поміщаєтся в контейнер (container). Контейнер "знає", як розмістити компоненти на екрані. Розуміється, в мові Java контейнер це обєкт класу Container або всякого його розширення. Ознайомтеся з цим класом. Прямий нащадок цього класу клас jcomponent вершина ієрархії багатьох класів бібліотеки Swing.
Увага! Ви постійно будете зустрічати імена компонентів двох типів, наприклад Button і jButton. Знайте, що перший компонент важкий і для його використання треба підключати бібліотеку AWT(import java.awt.*). Другий компонент легкий і для його використання треба підключати бібліотеку Swing(import java.swing.*). При створенні додатків для програміста немає значення, яку бібліотеку використовувати. А от при створенні аплетів, які запускаються браузером, використовується виключно AWT, хоча всього можна очікувати від нових версій Java.
Створивши компонент обєкт класу Component або його розширення, належить додати його до попередньо створеного обєкту класу container або його розширення одним із методів add(). Клас Container сам являється невидимим компонентом, він розширює клас Component. Таким чином, в контейнер поряд з компонентами можна поміщати контейнери, в яких знаходяться інші компоненти, досягаючи тим самим більшої гнучкості розміщення компонентів. Основне вікно додатку, активно взаємодіюче з операційною системою, необхідно побудувати по правилаx графічної системи. Воно повинне переміщатися по екрану, змінювати розміри, реагувати на дії миші і клавіатури. У вікні повинні бути, як мінімум, наступні стандартні компоненти.
Вікно з цими компонентами в готовому вигляді описане в класі Frame. Щоб створити вікно, досить зробити свій клас розширенням класу Frame, як показано в лістинзі 8.1. Всього вісім рядків тексту і вікно готове.
Лістинг 8.1. Найпростіше вікно додатку
import java.awt.*;
class TooSimpleFrame extends Frame{
public static void main(String[] args){
Frame fr = new TooSimpleFrame(); //Конструктор вікна
fr.setSize(400, 150); //Методами класу установлюємо властивості обєкту
fr.setVisible(true);
}
}
Класс TooSimpleFrame володіє всіма властивостями класу Frame, являючись його розширенням. В ньому створюється экземпляр вікна fr, і установлюються розміри вікна на екрані - 400x150 пікселів - методом setSize(). Якщо не задати розмір вікна, то на екрані появиться вікно мінімального розміру - тільки рядок заголовку. Звичайно, потім його можна розтянути за допомогою миші до будь-якого розміру.
Потім вікно виводиться на екран методом setVisible(true). Справа в тому, що, з точки зору бібліотеки AWT, створити вікно значить виділити область оперативної памяті, заповнену потрібними пікселями, а вивести вміст цієї області на екран - уже інша задача, яку і вирішує метод setVisible(true). Звичайно, таке вікно непридатне для роботи. Не кажучи уже про те, що у нього немає заголовка і тому вікно не можна закрити. Хоча його можна переміщати по екрану, міняти розміри, звертати на панель задач і розкривати, але команду завершення додатку ми не запрограмували. Вікно не можна закрити ані клацанням кнопкою миші по кнопці з хрестиком в правому верхньому куті вікна, ані комбінацією клавіш <Alt>+<F4>. Приходиться за-
вершати роботу додатку способами операційної системи, наприклад, комбінацією клавіш <Ctrl>+<C>, або закриттям вікна Командний рядок. В лістинзі 8.2 до програми лістингу 8.1 додані заголовок вікна і звернення до методу, що дозволяє завершити додаток.
Лістинг 8.2. Просте вікно додатку
import java.awt.*;
import java.awt.event.*;
class SimpleFrame extends Frame{
SimpleFrame(String s){
super (s);
setSize(400, 150);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit (0);
}
});
}
public static void main(String[] args){
new SimpleFrame(" Мy program");
}
}
Якщо ви запустите програму в середовищі JBuilder, то позбавитесь від надокучливого вікна Командная строка.
В програму додано конструктор класу SimpleFrame, що звертається до конструктора свого суперкласу Frame, який записує свій аргумент s в рядок заголовка вікна. В конструктор перенесена установка розмірів вікна, виведення його на екран і додано звернення до методу addWindowListener(), реагуючому на дії з вікном. В якості аргумента цьому методу передається екземпляр безіменного внутрішнього класу, розширяючого клас WindowAdapter. Цей безіменний клас реалізує метод windowСІosing(), що обробляє закриття вікна.
Дана реалізація дуже проста додаток завершається статичним методом exit() класу System. Вікно при цьому закривається автоматично. Все це ми детально розберемо в уроці 12, а поки що просто додавайте ці рядки у всі ваші програми для закрття вікна і завершення роботи додатку. Отже, вікно готове. Але воно поки що пусте. Виведемо в нього, по традиції, привітання "Hello, World!", правда, злегка змінене. В лістинзі 3.3 приведена повна програма цього виведення, а рис. 8.1 демонструє вікно.
Лістинг 8.3. Графічна програма з привітанням
import java.awt.*;
import java.awt.event.*;
class Hello extends Frame{
Hello(String s){
super(s);
}
public void paint(Graphics g){
g.setFont(new Font("Serif", Font.ITALIC | Font.BOLD, 30));
g.drawString("Hello, XXI century World!", 20, 100);
}
public static void main(String[] args){
Frame f = new Hello("Вітаю тебе, XXI століття!");
f.setSize(400, 150);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Рис. 8.1. Вікно програми-привітання
Для виведення тексту ми перевизначаєм метод paint() класу Сomponent. Клас Frame наслідує цей метод з пустою реалізацією. Метод paint() одержує в якості аргумента екземпляр g класу Graphics, що вміє, зокрема, виводити текст методом drawString(). В цьому методі крім тексту ми указуємо положення початку рядка у вікні - 20 пікселів від лівого краю і 100 пікселів зверху. Ця точка - ліва нижня точка першої літери тексту Н. Крім того, ми установили новий шрифт "Serif" більшого розміру - 30 пунктів, напівжирний, курсив. Всякий шрифт - обєкт класу Font, а задається він методом setFont() класу Graphics. Роботу з шрифтами ми розглянемо в наступному уроці. В лістинзі 8.3 ми винесли виклики методів установки розмірів вікна, виведення його на екран і завершення програми в метод main().
Як бачимо із цього простого прикладу, бібліотека AWT велика і розгалужена, в ній багато класів, взаємодіючих один з одним. Розглянемо ієрархію деяких найчастіше використовуваних класів AWT.
8.3. Ієрархія класів AWT
На рис. 8.2 показана ієрархія основних класів AWT. Основу її складають готові компоненти: Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField, Menubar, Menu, PopupMenu, Menultem, CheckboxMenuItem. Якщо цього набору замало, то від класу Canvas можна породити власні "важкі" компоненти, а від класу Component "легкі" компоненти.
Основні контейнери це класи Panel, ScrollPane, Window, Frame, Dialog, FileDialog. Свої "важкі" контейнери можна породити від класу Panel, а "легкі" від класу Сontainer. Цілий набір класів допомагає розміщувати компоненти, задавати колір, шрифт, рисунки і зображення, реагувати на сигнали від миші і клавіатури.
На рис. 8.2 показані і початкові класи ієрархії бібліотеки Swing класи JComponent, JWindow, JFrame, JDialog, JApplet.
Заключення
Як бачимо, бібліотека графічних класів AWT дуже велика і детально опрацьована. Ця різноманітність класів тільки відображає різноманітність задач побудови графічного інтерфейса. Бажання покращити інтерфейс безмежне. Воно приводит до створення все нових бібліотек класів і розширенню існуючих. Незалежними виробниками створено уже багато графічних бібліотек Java: KL Group, JBCL, і зявляються все нові і нові бібліотеки. Інформацію про них можна одержати на сайтах, указаних в уроці 1. В наступних уроках ми детально розглянемо, як можна використовувати бібліотеку AWT для створення власних додатків з графічним інтерфейсом користувача, зображеннями, анімацією і звуком.
Рис. 8.2. Ієрархія основних класів AWT
Лабораторна робота 7. Робота з графічними компонентами
class Hello extends Frame{
Hello(String s){
super(s);
Button button1 = new Button("Button1");
add(button1);
}
Color cl = new Color(255,0,0);
button1.setBackground(cl);
Про інші конструктори класу Color почитайте у відповідному файлі.