Depois de criarmos uma exibição e alguns widgets, e termos inicializado o loop de mensagem do aplicativo, onde acontece o trabalho real? Ele acontece toda vez que um evento é lido na fila e é feito o dispatch dele para um widget. A maior parte da lógica do aplicativo é implementada como respostas a eventos do usuário.
O padrão básico é incluir um atendente em algum widget que você criou. Quando o evento apropriado ocorre, o código do atendente é executado. Esse exemplo simples é adaptado do 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 ()); } });
Para cada tipo de atendente, há uma interface que define o atendente (XyzListener), uma classe que fornece informações sobre o evento (XyzEvent) e um método de API para incluir o atendente (addXyzListener). Se há mais de um método definido na interface do atendente, um adaptador (XyzAdapter), o qual implementa a interface do atendente e fornece métodos vazios, é fornecido. Todos os eventos, atendentes e adaptadores estão definidos no pacote org.eclipse.swt.events.
A tabela a seguir resume os eventos que estão disponíveis e os widgets que suportam cada evento.
Tipo de Evento |
Descrição |
Widgets |
---|---|---|
Arm |
Gerado quando um widget, como um item de menu, é montado. |
MenuItem |
Control |
Gerado quando um controle é movido ou redimensionado. |
Control, TableColumn, Tracker |
Dispose |
Gerado quando um widget é descartado, de forma programática ou pelo usuário. |
Widget |
Focus |
Gerado quando um controle ganha ou perde foco. |
Control |
Help |
Gerado quando o usuário solicita ajuda ao widget, como ao pressionar a tecla F1. |
Control, Menu, MenuItem |
Key |
Gerado quando o usuário pressiona ou libera a tecla do teclado, quando o controle tem foco no teclado. |
Control |
Menu |
Gerado quando um menu está oculto ou está sendo mostrado. |
Menu |
Modify |
Gerado quando o texto de um widget é modificado. |
CCombo, Combo, Text, StyledText |
Mouse |
Gerado quando o usuário pressiona, libera ou clica duas vezes com o mouse sobre o controle. |
Control |
MouseMove |
Gerado conforme o usuário move o mouse pelo controle. |
Control |
MouseTrack |
Gerado quando o mouse entra, sai ou pára sobre o controle. |
Control |
Paint |
Gerado quando o controle precisa ser repintado. |
Control |
Selection |
Gerado quando o usuário seleciona um item no controle. |
Button, CCombo, Combo, CoolItem, CTabFolder, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, Table Cursor, TableColumn, TableTree, Text, ToolItem, Tree |
Shell |
Gerado quando um shell é minimizado, maximizado, ativado, desativado ou fechado. |
Shell |
Traverse |
Gerado quando um controle é desviado pelo usuário utilizando pressionamentos de teclas. |
Control |
Tree |
Gerado quando o usuário expande ou reduz itens na árvore. |
Tree, TableTree |
Verify |
Gerado quando o texto de um widget está para ser modificado. Dá ao aplicativo a chance de alterar o texto ou evitar a modificação. |
Text, StyledText |
O sistema de evento digitado descrito acima é implementado com um mecanismo de evento do widget de baixo nível e não digitado. Esse mecanismo não é para ser utilizado pelos aplicativos, mas você o verá sendo utilizado dentro da implementação do SWT. Ele é também utilizado em muitas implementações de página do assistente do workbench.
O mecanismo não digitado conta com uma constante para identificar o tipo de evento e define um atendente genérico fornecido com essa constante. Isso permite ao atendente implementar um atendente "estilo case". No snippet a seguir, definimos um identificador de evento genérico e incluímos vários atendentes em um shell.
Shell shell = new Shell(); Listener listener = new Listener() { public void handleEvent(Event e) { switch (e.type) { case SWT.Resize: System.out.println("Redimensionamento recebido."); break; case SWT.Paint: System.out.println(Desenho recebido."); break; default: System.out.println("Evento desconhecido recebido"); } } }; shell.addListener(SWT.Resize, listener); shell.addListener(SWT.Paint, listener);