Назад
Вперед
3.13. Кнопки и события в JDK 1.1
Пример демонстрирует приемы обработки событий
от кнопок и окна автономного приложения Java с
использованием модели, принятой в JDK версии 1.1.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Известно, что в JDK версий 1.1 и 1.2 используется
новый механизм обработки событий, отличный от
того, к которому вы привыкли раньше в JDK версии 1.0.
Данный механизм предполагает существование двух
или большего количества объектов, связанных с
обработкой событий: источников события (event source) и
приемников события (event listener).
Как нетрудно догадаться из названия, источник
создает события , а приемник - обрабатывает их.
В качестве источника события обычно выступают
различные компоненты, такие как кнопки, списки и
так далее, а также мышь и клавиатура.
Обработчиком события может служить любой класс,
если он реализует соответствующий интерфейс и
зарегистрирован в качестве обработчика событий.
В моделях обработки событий JDK версии 1.1 и 1.2 с
каждым типом события связывается определенный
класс. Например, события, возникающие при нажатии
кнопок класса Button относятся к классу ActionEvent,
события связанные с мышью - к классу MouseEvent, с
клавиатурой - KeyEvent и так далее.
Если какой-либо класс собирается обрабатывать
события, связанные с кнопками класса Button, то он
должен реализовать интерфейс ActionListener. В рамках
этого интерфейса предусмотрен только один метод
с названием actionPerformed. Этот метод будет вызываться
при возникновении любых событий, связанных с
кнопкой.
Интерфейс для обработки событий от мыши
называется MouseListener и в его рамках определено пять
методов, таких как mouseClicked, mouseEntered, mouseExited и других.
Однако для того чтобы класс мог обрабатывать
события, недостаточно только реализовать в нем
все функции того или иного интерфейса обработки
событий. Дополнительно нужно зарегистрировать
объект данного класса для обработки нужных вам
событий.
Такая операция выполняется специальными
методами, название которых зависит от класса
события. Например, регистрацию для обработки
событий от кнопок Button следует выполнять методом
addActionListener, а для обработки событий от мыши -
addMouseListener.
Описание примера
Наш пример выполнен в виде автономного
приложения Java с использованием окна класса Frame. В
этом окне расположены четыре кнопки, две из
которых изменяют цвет фона, а две другие
предназначены для блокировки возможности такого
изменения (рис. 1).
Рис. 1. Автономное приложение Java с кнопками
Рассмотрим исходный текст приложения.
Прежде всего обратим ваше внимание на то, что в
исходный текст приложения помимо обычных для
наших приложений классов мы импортировали
классы java.awt.event.*:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
Там определены нужные нам классы и интерфейсы.
Главный класс приложения
Главный класс нашего автономного приложения Java
выглядит очень просто:
public class SimpleButtonJDK11
{
public static void main(String args[])
{
FrameWindow frame;
frame = new FrameWindow("Frame window");
frame.init();
frame.show();
}
}
Здесь статический метод main, получающий
управление при запуске приложения, создает
главное окно приложения как объект класса FrameWindow.
Этот класс определен в нашем приложении как
дочерний для класса Frame.
Сразу после создания этого окна мы выполняем
его инициализацию методом init и отображение
методом show.
Класс FrameWindow
Класс FrameWindow выполняет всю работу по
обеспечению функционирования нашего приложения.
Прежде всего заметим, что этот класс реализует
два интерфейса с именами ActionListener и WindowListener:
class FrameWindow extends Frame
implements ActionListener, WindowListener
{
. . .
}
Эти интерфейсы реализованы нами для обработки
событий от кнопок, расположенных в окне класса
FrameWindow, а также от самого этого окна при его
закрытии.
В классе FrameWindow определены также четыре поля,
предназначенные для хранения ссылок на кнопки:
Button btnYellowBackground; // желтый цвет фона
Button btnWhiteBackground; // белый цвет фона
Button btnDisable; // блокировка кнопок
Button btnEnable; // разблокировка кнопок
Конструктор класса FrameWindow вызывает конструктор
базового класса Frame, а затем устанавливает
размеры окна:
public FrameWindow(String szTitle)
{
super(szTitle);
setSize(400, 90);
}
Метод paint
Для перерисовки окна мы вызываем метод paint
родительского класса Frame:
public void paint(Graphics g)
{
super.paint(g);
}
Метод init
Метод init вызывается статическим методом main,
определенном в главном классе нашего приложения
и выполняет инициализацию окна.
Прежде всего, он создает в окне четыре кнопки:
btnYellowBackground = new Button("Yellow");
btnWhiteBackground = new Button("White");
btnDisable = new Button("Disable");
btnEnable = new Button("Enable");
Для того чтобы кнопки располагались в окне
последовательно слева направо в порядке
добавления, мы устанавливаем режим FlowLayout системы
Layout Manager:
setLayout(new FlowLayout());
Далее мы добавляем кнопки в окно методом add:
add(btnYellowBackground);
add(btnWhiteBackground);
add(btnDisable);
add(btnEnable);
Кнопка с надписью Enable переводится в
заблокированное состояние, так как изначально
кнопки управления цветом фона окна
разблокированы:
btnEnable.setEnabled(false);
Теперь обратите внимание на действия по
регистрации приемников событий, выполняемых
методом init.
Сначала при помощи метода addActionListener мы
регистрируем класс FrameWindow как приемник сообщений
от кнопок:
btnYellowBackground.addActionListener(this);
btnWhiteBackground.addActionListener(this);
btnDisable.addActionListener(this);
btnEnable.addActionListener(this);
Метод вызывается для каждой кнопки. В качестве
параметра методу addActionListener передается ссылка на
текущий объект класса FrameWindow.
Дополнительно нам необходимо зарегистрировать
класс FrameWindow как приемник событий, связанных с
выполнением операций над окном этого же класса:
this.addWindowListener(this);
Обратите внимание, что метод addWindowListener
вызывается для текущего объекта. В качестве
параметра ему передается ссылка также на текущий
объект.
Метод actionPerformed
Этот метод был нами определен как составная
часть интерфейса ActionListener. Он получает
управление, когда пользователь нажимает на одну
из кнопок, расположенных в окне приложения.
В качестве параметра методу actionPerformed
передается ссылка на объект класса ActionEvent,
связанного с источником события:
public void actionPerformed(ActionEvent e)
{
. . .
}
При помощи этой ссылки мы определяем, какая из
четырех кнопок вызвала появление события.
Каким образом?
Эта задача решается при помощи метода getSource,
возвращающего ссылку на объект, послуживший
источником события. Мы последовательно
сравниваем значение, полученное от этого метода,
со ссылками на наши кнопки, выполняя при
совпадении необходимые действия по изменению
цвета фона, блокированию и разблокированию
кнопок:
if(e.getSource().equals(btnYellowBackground))
{
setBackground(Color.yellow);
}
else if(e.getSource().equals(
btnWhiteBackground))
{
setBackground(Color.white);
}
else if(e.getSource().equals(btnDisable))
{
btnWhiteBackground.setEnabled(false);
btnYellowBackground.setEnabled(false);
btnDisable.setEnabled(false);
btnEnable.setEnabled(true);
}
else if(e.getSource().equals(btnEnable))
{
btnWhiteBackground.setEnabled(true);
btnYellowBackground.setEnabled(true);
btnEnable.setEnabled(false);
btnDisable.setEnabled(true);
}
Затем мы перерисовываем окно нашего
приложения:
repaint();
Метод windowClosing
Этот метод вызывается, когда пользователь
пытается закрыть окно нашего приложения. В его
задачу входит скрытие окна и завершение работы
виртуальной машины Java:
public void windowClosing(WindowEvent e)
{
setVisible(false);
System.exit(0);
}
Метод windowClosing определен как часть интерфейса
WindowListener.
Другие методы интерфейса WindowListener
Следующие методы необходимо определить как
часть интерфейса WindowListener, несмотря на то что они
ничего не делают в нашем приложении:
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
Определив эти методы, мы можем обрабатывать
события, связанные с открытием и закрытием окна,
с его минимизацией и восстановлением размеров, с
активизацией и деактивацией.
Заметим, что при использовании специальных
классов, называемых адаптерами, можно избежать
необходимости определения пустых методов при
реализации интерфейсов.
Назад Вперед |