События

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

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