Где же происходит настоящая работа после того, как мы создали окно и несколько виджетов и запустили цикл сообщений приложения? Она происходит каждый раз, когда событие читается из очереди и передается в виджет. Логика большинства приложений основана на принципе отклика на пользовательские события.
Основная схема такова: вы добавляете к некоторым созданным виджетам получатели запросов, и когда происходит соответствующее событие, выполняется код этих получателей. Ниже приведен пример, взятый из 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);