Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MIR-Lektsii_Java.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
207 Кб
Скачать
☆

Лекция 5. Модель обработки событий Java1.0. Реализация графического интерфейса в Java. План

  1. Модель обработки событий Java 1.0.

  2. Размещение объектов для графического пользовательского интерфейса.

  3. Использование меню.

  4. Окна Frame.

  5. Работа с изображениями.

  6. Динамическая диспетчеризация методов.

  7. Абстрактные классы.

  8. Знакомство с классами Vector, Rectangle.

1.

Все управляющие элементы, кроме меток, которые являются пассивными, генерируют события при обращении к ним пользователя. По умолчанию, обработка всех возникающих в окне апплета простых событий выполняет метод handleEvent(). Для создания своей собственной обработки события следует переопределить этот метод. При переопределении только некоторых событий из допустимого набора следует в завершение обработки для всех оставшихся событий вызвать метод суперкласса handle().

Он имеет следующий вид:

public boolean handleEvent(Evt evt){

if (…){

//тело метода

return true;

}

else super.handleEvent(evt);

}

Но для обработки событий, сгенерированных управляющими элементами, программа должна перекрыть обработчик события, представленный методом action(). Он определен в классе Component и возвращает true в случае успешной обработки события и false в противном случае.

Перекрытый метод action имеет вид:

public boolean action(Event evt, Object arg){

if

//

return true;

}

else return false;

}

Evt описывает событие, а arg является ссылкой на объект, связанный с этим событием.

При обработке событий управляющих элементов можно получить доступ ко всем переменным класса Event. Это позволяет облегчить определение способа обработки каждого события. Наиболее часто используются следующие переменные:

  • target, где содержится ссылка на объект, сгенерировавший событие;

  • id соержит константу, идентифицирующую данное событие (значения KEY_PRESS, LIST_SELECT – выбор из списка).

Пример:

// создание кнопок {реализуется в методе init()}

Button one = new Button(“One”);

Button two = new Button(“Two”);

add(one); add(two);

// метод action при нажатии на кнопку

public boolean action(Event evt, Object arg){

if (evt.target instance of Button){

if (arg.equals(“One”)){

msg = “Выбрана кнопка One”;

}

return true;

}

return false;

}

Внешний if проверяет, является ли кнопкой объект, сгенерировавший событие, далее проверка, на какую кнопку нажали. Но этот метод можно упростить:

if (evt.target == one){

if (arg.equals(“One”)){

msg = “Выбрана кнопка One”;

}

return true;

}

return false;

}

Метод action() получает все события, которые были сгенерированы в апплете управляющими элементами.

2.

Для правильного размещения графических объектов в окне апплета или другом окне в Java используется графический компоновщик объектов. Все объекты размещаются в окне при помощи диспетчеров компоновки, которые автоматически упорядочивают управляющие элементы согласно определенному алгоритму.

С каждым объектом типа Container связан диспетчер компоновки, который может являться экземпляром любого класса, реализующего интерфейс LayoutManager. Диспетчер компоновки задается при помощи метода setLayout(LayoutManager диспетчер). Если он не вызывается, то используется стандартный диспетчер компоновки.

Для отключения диспетчера компоновки используется тот же метод, но с параметром null.

Диспетчера компоновки:

  1. FlowLayout – стандартный диспетчер компоновки. Он размещает объекты слева направо, пока они вмещаются на линии, а затем переходит на новую строку и по умолчанию каждая линия центрируется.

Для выравнивания необходимо создать диспетчер компоновки при помощи конструктора следующего вида: FlowLayout.(int режим). Параметр “режим“ может принимать следующие значения:

  • FlowLayout.LEFT;

  • FlowLayout.RIGHT;

  • FlowLayout.CENTER.

Для задания расстояния по вертикали и горизонтали между объектами используется конструкция

  • FlowLayout(int режим, int горизоталь, int вертикаль).

  1. BorderLayout делит всю область окна апплета на пять частей (по границам 4 области и одна в центре). Обратиться к этим областям можно по имени:

  • North;

  • South;

  • East;

  • West;

  • Center.

Сначала диспетчер создаем при помощи стандартного конструктора BorderLayout(), а при добавлении объектов используется метод add(String область, Component объект).

  1. GridLayout размещает компоненты в виде двумерной таблицы. При добавлении элементов они записываются в таблицу построчно. Нужно задать количество строк и столбцов при помощи конструктора GridLayout(int строки, int столбцы).

  2. CardLayout содержит несколько различных типов компоновки. Каждый вариант можно рассматривать как отдельную колоду карт, т.е. видна только одна верхняя карта. В данном классе есть один стандартный конструктор. Объекты помещаются в Panel, для которой выбирается компоновщик CardLayout и каждая карточка помещается на отдельную панель, главная панель добавляется к апплету. При добавлении карточки к панели им присваиваются имена. Для этого используется метод add(String имя, Component панель).

После того, как создана вся колода можно активизировать карточку, используя один из методов:

  • first(Container колода);

  • last(Container колода);

  • next(Container колода);

  • previous(Container колода).

Чтобы активизировать конкретную карточку, используется метод:

  • show(Container колода, String карточка).

Пример:

public class Demo extends Applet{

Checkbox win95, winNT, sol, mac;

Panel osCards;

CardLayout cardlo;

public void init(){

Button win = new Button(“Windows”);

Button other = new Button(“Other”);

add(win);

add(other);

cardLo = new CardLayout();

osCards = new Panel();

osCards.setLayout(cardLo);

win95 = new Checkbox(“Win 95”);

winNT = new Checkbox(“Win NT”);

sol = new Checkbox(“Solaris”);

mac = new Checkbox(“Mac OS”);

Panel winPan = new Panel();

winPan.add(win95);

winPan.add(winNT);

winPan.add(sol);

winPan.add(mac);

// создание второй панели otherPan производится аналогично

osCards.add(“Window”, winPan);

osCards.add(“Other”, otherPan);

add(osCards);

}

public boolean mouseDown(Event evt, int x, inty){

cardLo.next(osCards);

return true;

}

public boolean action(Event evt, Object arg){

if (evt.target instanceof Button){

if (arg.equals (“Windows”))

cardLo.show(osCards, “Windows”);

return true;

}

return false;

}

}

3.

Концепция меню реализована в Java с помощью классов:

  • MenuBar;

  • Menu;

  • MenuItem.

Строка меню содержит один или несколько объектов Menu, каждый из которых содержит список объектов MenuItem. Т.к. Menu является подклассов MenuItem, то в Java возможно создавать встроенные меню. Также Java позволяет создавать переключаемые пункты меню типа CheckBoxMenuItem.

Этапы создания меню в Java:

  • сначала необходимо создать экземпляр класса MenuBar при помощи стандартного конструктора;

  • создать экземпляр класса Menu, пункты Menu можно создать при помощи классов MenuItem или CheckBoxMenuItem;

  • после создания пункта меню, его необходимо добавить к объекту Menu при помощи метода add(MenuItem пункт_меню);

  • объект Menu добавляется к строке меню с помощью аналогичного метода add(Menu меню).

Меню втсраиваются только в окна типа Frame.

4.

Frame используется для создания дочерних окон в апплетах или приложениях. Класс Frame имеет два конструктора:

  • стандартный – Frame();

  • Frame(String заголовок_окна).

При их помощи можно создать окно с заголовком и без заголовка.

Чтобы установить размеры окна, используется метод resize в двух формах:

  • resize(int ширина, int высота);

  • resize(Dimension размер).

Текущий размер окна можно получить при помощи метода size(), который вызывает объект типа Dimension.

Созданное окно не будет видно, пока не вызван метод show(), для его скрытия используется метод hide().

Окно класса Frame обрабатывает событие, которое генерируется при закрытии окна. Для реакции на него, апплет должен перекрыть метод handleEvent().В нем можно определить какое событие произошло, проверяя поле id объекта Event. В нем есть константа window_destroy. Метод для обработки закрытия окна выглядим так:

public boolean handleEvent(Event arg){

if (arg.id == Event.window_destroy){

// Реакция – тело метода

return true;

}

return super.handleEvent(arg);

}

Реакция на событие window_destroy зависит от того, относится ли оно к главному окну приложения или дочернему окну апплета. Если это событие получает апплет, то он должен удалить окно с экрана при помощи метода hide(). Без этого окно никогда полностью не удалится.

Если же событие относится к окну верхнего уровня, то необходимо выйти из среды выполнения Java, вызвав метод System.exit().

class Mframe extends Frame{

CheckBoxMenuItem text;

Mframe(String title){

super(title);

MenuBar mbar = new MenuBar();

setMenuBar(mbar);

Menu file = new Menu(“File”);

file.add(new MenuItem(“New...”));

…

mbar.add(file);

Menu edit = new Menu(“Edit”);

…

Menu sub = new Menu(“Special”);

sub.add(new MenuItem(“...”);

…

edit.add(sub);

test = new CheckBoxMenuItem(“Test”);

edit.add(test);

mbar.add(edit);

{далее реализуется метод, вызываемый при закрытии окна handleEvent()}

{в классе Frame можно реализовать обработчик событий action()}

}

}

class Demo extends Applet{

Frame f;

public void init(){

f = new Mframe(“Menu”);

…

f.show();

}

public void start(){

f.show();

}

public void stop(){

f.hide();

}

}

5.

Изображение является объектом класса Image, который входит в пакет java.awt. Для работы с изображениями существует три основные операции:

  • создание;

  • загрузка;

  • вывод на экран.

Класс Component содержит метод createImage(int x, int y). Он возвращает чистое изображение заданной ширины и высоты.

Canvas c = new Canvas();

Image text = c.createImage(200,100);

Изображение можно не создавать, а загружать с помощью метода getImage() класса Applet. Он имеет две версии:

  • getImage(URL адрес);

  • getImage(URL адрес, String имя).

Изображение выводится на экран при помощи метода drawImage() класса Graphics:

drawImage(Image объект, int x, int y, ImageObserver контроллер),

где контроллер – объект, который может отслеживать процесс загрузки изображения.

class Demo extends Applet{

Image img;

public void init(){

img = getImage(getDocumentBase(), getParametr(“name”));

}

public void paint(Graphics g){

g.drawImage(img,0,0,this);

}

}

Изображение на экране появляется не сразу, а постепенно, т.к. реализация интерфейса ImageObserver вызывает метод paint() при каждом поступлении новой порции данных изображения.

6.

Переменная, являющаяся ссылкой на объект суперкласса, может ссылаться на объект любого подкласса, произведенного от этого суперкласса.

Box box1 = new Box();

SubBox box2 = new SubBox();

box1 = box2; - правильно

Однако необходимо помнить, что возможность доступа к элементам определяется не типом объекта, на который осуществляется ссылка, а типом самой переменной ссылки. Т.о. при присвоении значения ссылки на объект подкласса, переменной, являющейся ссылкой на объект суперкласса, доступ возможен только к тем членам класса, которые определены в суперклассе.

Пример: имеется суперкласс Box с методом volume() и его подкласс WeightBox() с переменной weight.

WeightBox box1 = new WeihtBox();

Box box2 = new Box();

box1.volume(); - метод доступен

box2 = box1; - операция доступна

box2.volume(); - метод доступен

box2.weight; - переменная не доступна

Перекрытие методов лежит в основе одного из принципов языка Java: динамической диспетчеризации методов. Это механизм, посредством которого вызов перекрытого метода осуществляется во время выполнения программы, а не на этапе компиляции.

Динамическая диспетчеризация методов является способом обеспечения полиморфизма в Java на этапе выполнения программы.

Определяющим параметром при выборе версии перекрытого метода является тип объекта, на который в переменной имеется ссылка, но не тип самой переменной.

Если в суперклассе определен метод, перекрытый впоследствии в подклассе, то при ссылке переменной на объекты различных типов выполняются различные версии этого метода.

Иерархия классов:

Каждый из представленных классов имеет метод call().

ob1 – объект класса A;

ob2 – объект класса B;

ob3 – объект класса C.

A r;

r = ob1; r.call(); – вызов метода класса A

r = ob2; r.call(); – вызов метода класса B

r = ob3; r.call(); – вызов метода класса C

7.

Иногда необходимо определить суперкласс, в котором задается некоторая абстрактная структура без полной реализации всех методов. В классе определяется природа методов, которые будут реализованы в подклассах.

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

В Java есть возможность, позволяющая убедиться, что в подклассе перекрыты все необходимые методы. Для этого эти методы определяются как абстрактные и оставляются без реализации.

Используется следующая форма объявления метода:

abstract тип имя(параметры);

Любой класс, содержащий один или несколько абстрактных методов, объявляется абстрактным:

abstract class имя…

У такого класса не может быть объектов. Абстрактными не могут быть конструкторы и статические методы. Абстрактные класс могут содержать в себе различные методы, в том числе и методы с реализацией. Каждый подкласс абстрактного класса должен либо включать реализацию всех абстрактных методов, либо быть объявленным абстрактным.

Несмотря на то, что нельзя создавать объекты абстрактных классов, их можно использовать для создания ссылок на объекты.

abstract class Figure{

double dim1, dim2;

Figure(double a, double b){

dim1 = a; dim2 = b;

}

abstract double area();

}

class Rect extends Figure{

Rect(double a, double b){

super(a,b);

}

double area(){

return dim1*dim2;

}

}

class Triangle extends Figure{

Triangle(double a, double b){

super(a,b);

}

double area(){

return dim1*dim2/2;

}

}

class Demo{

public static void main(String arg[]){

Rect r = new Rect(9, 5);

Triangle t = new Triangle(10, 8);

Figure f;

f = r; f.area();

f = t; f.area();

}

}

8.

Класс Vector:

Массивы в Java имеют фиксированную длину., т.е. необходимо заранее определять размер массива. Java позволяет задать массив переменной длины из ссылок на объекты. Для этого используется класс Vector.

Первоначально Vector ограничен определенным количеством элементов. При его превышении вектор автоматически увеличивается, при удалении объектов – может уменьшаться.

Конструкторы класса:

  • Vector() – создает вектор с параметром по умолчанию, его размер равен 10 элементам;

  • Vector(int размер)- создает вектор с заданным размером.

При создании вектор инициализируется нулевыми значениями.

Методы данного класса:

  1. addElement(Object объект) – добавляет к вектору указанный объект;

  2. contains(Object объект) – возвращает true, если вектор содержит объект, указанный как параметр, в противном случае false;

  3. elementAt(int индекс) – возвращает элемент вектора по заданному индексу типа Object, следовательно, необходимо преобразование типов.

  4. firstElement() – возвращает первый элемент вектора типа Object;

  5. lastElement() – возвращает последний элемент типа Object;

  6. size() – возвращает количество элементов, содержащихся в данный момент в векторе;

  7. removeElement(Object объект) – удаляет указанный объект из вектора. Если вектор содержит несколько экземпляров объекта, то удаляется первый из них. Если удаление прошло удачно, то метод возвращает true, в противном случае false.

Класс Vector находится в пакете java.util.

Класс Rectangle:

Класс Rectangle находится в пакете java.awt. Данный класс описывает прямоугольную область, задаваемую координатами верхней левой вершины и размерами по ширине и высоте. => определено 4 переменные:

  • height;

  • width;

  • x;

  • y.

Конструкторы класса:

  • rectangle() – создается прямоугольник сначала в точке (0,0), ширина=0, высота=0;

  • rectangle(int width, int height) – создается прямоугольник в точке (0,0) с заданной шириной и высотой;

  • rectangle(int x, int y, int width, int height) – создается прямоугольник в точке (x,y) с заданной шириной и высотой.

Методы класса Rectangle:

equals(Object объект) – возвращает true, если параметр является объектом типа Rectangle и имеет те же координаты верхнего левого угла, ширину и высоту, что и данный объект;

inside(int x, int y) – проверяет находится ли точка внутри данного прямоугольника, если да, то возвращает true, в противном случае false;

move(int x, int y) – перемещает прямоугольник в соответствии с новыми координатами верхнего левого угла;

reshape (int x, int y, int width, int height) – перечерчивает прямоугольник с новыми параметрами;

resize(int width, int height) – изменяет размеры прямоугольника.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]