Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / ООП / Введение_SWG.pdf
Скачиваний:
82
Добавлен:
23.02.2015
Размер:
3.32 Mб
Скачать

1.4 Слушатели событий

Где же происходит остальная работа после того, как создано окно и в нем несколько виджетов и запущен цикл обработки сообщений приложения? Она происходит каждый раз, когда событие читается из очереди и передается в виджет. Логика большинства приложений основана на программной реакции на происходящие события.

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

В абстрактном классе Widget пакета org.eclipse.swt.widgets определен метод addListener(int eventType, Listener listener),

позволяющий связать с визуальным компонентом обработчик нужного события. Первый параметр eventType задает тип события, который является одной из констант, определенных в пакете org.eclipse.swt. Второй

параметр должен быть экземпляром объекта произвольного класса, но обязательно реализующим интерфейс Listener, который определен в том же пакете org.eclipse.swt.widgets. По соглашениям об интерфейсах в

языке Java все реализации объявленного интерфейса

Listener должны

обеспечивать реализацию метода handleEvent(Event

e) с единственным

параметром-событием. Этот метод вызывается исполняемой средой SWT, чтобы организовать обработку события. Способ, которым создается нужный объект, выбирает программист по своему усмотрению. Например, для обработки события меню имеется объект

static Listener onExit = new Listener () {

// Обработка команды меню "Выход" public void handleEvent (Event e) {

shell.close(); // Выполняемое действие

}

};

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

добавляется

PUSH);

itemExit.addListener (SWT.Selection, onExit);

20

Здесь константа SWT.Selection задает тип обрабатываемого события и определена в пакете org.eclipse.swt (рекомендуем просмотреть состав этого пакета в службе помощи).

Другой вариант создания объекта-слушателя использует фрагмент вызова конструктора прямо в методе addListener как выражения,

создающего экземпляр и возвращающего ссылку на него. Например:

itemExit.addListener (SWT.Selection, new Listener () { public void handleEvent (Event e) {

shell.close();

}

});

Кроме метода addListener многие виджеты имеют его специализированные аналоги вида addXyzListener с одним параметром – обработчик события, что можно увидеть в примере ниже. В этом случае часть имени Xyz и определяет тип события для добавляемого обработчика. С перечнем дополнительных методов для добавления обработчиков для каждого конкретного виджета можно познакомиться в службе помощи Eclipse. Для каждого типа получателя запросов есть свой интерфейс, определяющий этот получатель (XyzListener), класс, предоставляющий информацию о событии (XyzEvent), и метод API для добавления этого получателя (addXyzListener).

Если в интерфейсе получателя запросов определено несколько методов, то к ним еще добавляется адаптер (XyzAdapter), реализующий интерфейс получателя и предоставляющий пустые методы. Все события, получатели запросов и адаптеры определены в пакете org.eclipse.swt.events. В разделе 8 будет приведен пример создания компонента с возможностью обработки событий, где имя метода задается произвольно разработчиком компонента.

Ниже приведен пример, взятый из org.eclipse.swt.examples.helloworld. HelloWorld3:

Display display = new Display (); Shell shell = new Shell (display);

Label label = new Label (shell, SWT.CENTER);

...

shell.addControlListener (new ControlAdapter () { public void controlResized (ControlEvent e) {

label.setBounds (shell.getClientArea ());

}

});

Для справки в таблице 1.1 приведен состав пакета org.eclipse.swt.events

21

Таблица 1.1 – Состав пакета org.eclipse.swt.events

Интерфейсы

Классы

Описание

 

 

Классы, которые осуществляют

 

ArmEvent

этот интерфейс, обеспечивают

ArmListener

 

метод, который имеет дело с

 

 

событием, когда виджет,

 

 

например, пункт меню отмечен

 

ControlAdapter

События сгенерированы

ControlListener

ControlEvent

движущимся и изменяющим

 

 

размеры элементом управления

DisposeListener

DisposeEvent

Виджет удаляется

FocusListener

FocusAdapter

Получение или потеря фокуса

FocusEvent

ввода (активности)

 

HelpListener

HelpEvent

Нажатие клавиши F1

KeyListener

KeyAdapter

Нажатие клавиши на клавиатуре

KeyEvent

 

 

MenuListener

MenuAdapter

Показ или скрытие меню

MenuEvent

 

 

ModifyListener

ModifyEvent

Модификация текста

MouseListener

MouseAdapter

Нажатие кнопки мыши

MouseEvent

 

 

MouseMoveListener

 

Перемещение указателя мыши

MouseTrackListener

MouseTrackAdapter

Перемещение указателя мыши

 

поверх элемента

 

 

PaintListener

PaintEvent

Запрос на перерисовку

SelectionListener

SelectionAdapter

Виджет выбран пользователем

SelectionEvent

 

 

ShellListener

ShellAdapter

Изменение состояния оболочки

ShellEvent

 

 

TraverseListener

TraverseEvent

Покидание виджета

TreeListener

TreeAdapter

Распахивание или сворачивание

TreeEvent

ветви дерева

 

VerifyListener

VerifyEvent

Модификация текста виджета

 

TypedEvent

Суперкласс для всех клавиатурных

 

 

событий

 

 

 

22

Соседние файлы в папке ООП