Где же происходит настоящая работа после того, как мы создали окно и несколько виджетов и запустили цикл сообщений приложения? Она происходит каждый раз, когда событие читается из очереди и передается в виджет. Логика большинства приложений основана на принципе отклика на пользовательские события.
Основная схема такова: вы добавляете к некоторым созданным виджетам получатели запросов, и когда происходит соответствующее событие, выполняется код этих получателей. Ниже приведен пример, взятый из 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 ());
}
});
Для каждого типа получателя запросов есть интерфейс, определяющий этот получатель (XyzListener), класс, предоставляющий информацию о событии (XyzEvent), и метод API для добавления этого получателя (addXyzListener). Если в интерфейсе получателя запросов определено несколько методов, то к ним еще добавляется адаптер (XyzAdapter), реализующий интерфейс получателя и предоставляющий пустые методы. Все события, получатели запросов и адаптеры определены в пакете org.eclipse.swt.events.
В приведенных ниже таблицах описаны события и виджеты для каждого из них. События можно разделить на две основные группы: высокоуровневые, представляющие абстрактные действия по отношению к управляющему элементу, и низкоуровневые, представляющие конкретные элементарные действия. Высокоуровневые события представляют из себя определенную последовательность низкоуровневых, которая может быть разной для каждой платформы. Низкоуровневые события рекомендуется использовать только при реализации пользовательских виджетов.
Тип события |
Описание |
|---|---|
| Activate, Decativate | Генерируется при активации или деактивации управляющего элемента. |
| Arm | Генерируется при наведении указателя мыши (или выделении иным способом) на пункт меню. |
| Close | Генерируется при закрытии Shell по запросу администратора окон. |
| DefaultSelection | Генерируется при вызове главного действия виджета. Например, нажатием Enter или двойным щелчком на ряде в таблице. |
| Dispose | Генерируется при освобождении виджета, программном или действиями пользователя. |
| DragDetect | Генерируется при начале перетаскивания. |
| Expand, Collapse | Генерируется при разворачивании или сворачивании элемента дерева. |
| Help | Генерируется при вызове справки виджета. Например, нажатием F1 в Windows. |
| Iconify, Deiconify | Генерируется при сворачивании, разворачивании или восстановлении Shell. |
| MenuDetect | Генерируется при вызове контекстного меню. |
| Modify | Генерируется при изменении текста виджета. |
| Move, Resize | Генерируется при изменении положения или размеров виджета, программном или действиями пользователя. |
| Selection | Генерируется при выборе пункта в управляющем элементе. Например, щелчком на ряде в таблице или проходом по пунктам с помощью клавиатуры. |
| SetData | Должны быть установлены данные в TableItem при использовании виртуальной таблицы. |
| Show, Hide | Генерируется при изменении видимости управляющего элемента. |
| Traverse | Пользователь пытается покинуть управляющий элемент с помощью клавиатуры. Например, нажимая Escape или Tab. |
| Verify | Генерируется при попытке изменить текст виджета. Приложение может принять изменение или отказаться от него. |
Тип события |
Описание |
|---|---|
| FocusIn, FocusOut | Генерируется при получении или потере фокуса управляющим элементом. |
| KeyDown, KeyUp | Генерируется при нажатии или отпускании клавиши клавиатуры, если управляющий элемент связан с клавиатурой. |
| MouseDown, MouseUp, MouseDoubleClick | Генерируется при нажатии, отпускании кнопки мыши, а также при двойном щелчке. |
| MouseMove | Генерируется при перемещении указателя мыши над управляющим элементом. |
| MouseEnter, MouseExit, MouseHover | Генерируется при входе, выходе и остановке указателя мыши на управляющем элементе. |
| MouseWheel | Генерируется при прокрутке колесика мыши. |
| Paint | Генерируется при необходимости перерисовать управляющий элемент. |
Типичные системные события, описанные выше, реализованы с помощью низкоуровневого нетипичного механизма событий виджета. Нетипичный механизм основан на константах для определения типа события и общем получателе запросов для этих констант. Такой подход позволяет получателю запросов реализовывать обработку событий в операторе "case". В следующем фрагменте кода определяется общий обработчик событий и добавляются в оболочку несколько получателей запросов.
Shell shell = new Shell ();
Listener listener = new Listener () {
public void handleEvent (Event e) {
switch (e.type) {
case SWT.Resize:
System.out.println ("Resize received");
break;
case SWT.Paint:
System.out.println ("Paint received");
break;
default:
System.out.println ("Unknown event received");
}
}
};
shell.addListener (SWT.Resize, listener);
shell.addListener (SWT.Paint, listener);