Vimos como criar um display e alguns widgets e como executar o loop de mensagens do nosso aplicativo. Onde o trabalho real acontece? 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, CTabFolder, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, 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("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);