- •Обозначения и сокращения
- •Введение
- •1 Простое SWT приложение
- •1.1 Создание приложения
- •1.2 Запуск SWT программы из командной строки
- •1.3 Структура приложения
- •1.4 Слушатели событий
- •1.5 Работа с подпроцессами
- •1.5.1 Диспетчеризация внутренних событий
- •1.5.2 Нить пользовательского интерфейса SWT
- •1.5.3 Выполнение кода за пределами нити UI
- •1.5.4 Рабочая среда и нити
- •2 Элементы управления
- •2.1 Стандартные виджеты
- •2.2 Пользовательские виджеты
- •2.3 Класс Label
- •2.3.1 Стили
- •2.3.2 Текст
- •2.3.3 Изображение
- •2.3.4 Разделители
- •2.3.5 Выравнивание
- •2.3.6 Перенос слов текста
- •2.3.7 Пример использования этикеток
- •2.4 Класс Text
- •2.5 Класс Button
- •2.5.1 Стили
- •2.5.2 Текст
- •2.5.3 Изображение
- •2.5.4 Выравнивание
- •2.5.5 Push Button
- •2.5.6 Toggle Button
- •2.5.7 Check Box
- •2.5.8 Radio Button
- •2.5.9 Selection (выбор)
- •2.5.10 Указание используемой по умолчанию кнопки
- •2.6 Класс List
- •2.6.1 Стили
- •2.6.2. Добавление элементов в список
- •2.6.3. Удаление элементов из списка
- •2.6.4 Получение элементов списка
- •2.6.5 Настройка значений элементов
- •2.6.6 Поиск элементов
- •2.6.7 Выбор элементов списка
- •2.6.8 Обработка событий списка List
- •2.7 Класс Link
- •2.7.1 Стили
- •2.7.2. Текст
- •2.7.3. Обработчики событий
- •2.8 Класс Table
- •2.9 Класс TableColumn
- •2.10 Класс TableItem
- •2.11 Класс Item
- •2.12 Класс Combo
- •2.13 Класс FileDialog
- •2.14 Класс Menu
- •2.15 Класс MenuItem
- •2.16 Класс MessageBox
- •2.17 Класс TabFolder
- •2.18 Class TabItem
- •3 Макеты
- •3.1 Класс FillLayout
- •3.2 Класс GridLayout
- •3.3 Класс GridData
- •3.4 Класс RowLayout
- •3.5 Класс RowData
- •3.6 Класс FormLayout
- •3.7 Класс FormAttachment
- •3.8 Класс FormData
- •4 Графика
- •4.1 Класс GC
- •4.2 Класс Canvas
- •5 Пакет printing
- •5.1 Класс PrintDialog
- •5.2 Класс Printer
- •5.3 Класс PrinterData
- •6 Пакет events
- •6.1 Класс Event
- •7 Разработка приложений
- •8 Разработка новых компонент
- •9 Дополнительные возможности библиотеки SWG
- •9.1 Компоненты управления
- •9.2 Виджеты
- •9.3 Плоские формы
- •9.4 Линии, точки и ломанные
- •9.5 Класс PathShape
- •10 Анимация
- •10.1 Типы анимации
- •10.2 Анимация во времени
- •10. 3 Поддержка времени
- •10.4 Пример приложения с элементами анимации
- •Список использованных источников
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