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 é adicionar um atendente em algum widget que você criou, e quando o evento apropriado ocorrer o código do atendente será executado. Esse exemplo simples é adaptado de 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 adicionar o atendente (addXyzListener). Se houver mais de um método definido na interface do atendente, um adaptador (XyzAdapter) que implementa a interface do atendente e fornece métodos vazios também será fornecido.Todos os eventos, ouvintes 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 sem tipo conta com uma constante para identificar o tipo do evento e define um atendente genérico que é fornecido com essa constante. Isso permite ao ouvinte implementar um ouvinte "estilo case". No fragmento a seguir, definimos um identificador de evento genérico e incluímos vários ouvintes 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);