Uma vez criados o ecrã e alguns widgets, e iniciado o ciclo de mensagens da aplicação, onde acontece o verdadeiro trabalho? Acontece de cada vez que um evento é lido na fila e despachado para um widget. A maioria da lógica da aplicação é implementada como respostas a eventos de utilizador.
O padrão básico consiste em adicionar um ouvinte a algum widget que se tenha criado e quando ocorrer o evento apropriado é executado o código do ouvinte. Este 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 ouvinte, há uma interface que define o ouvinte (XyzListener), uma classe que faculta informações sobre eventos (XyzEvent) e um método de API que adiciona o ouvinte (addXyzListener). Se houver mais do que ummétodo na interface do ouvinte, haverá um adaptador (XyzAdapter) que implementa a interface do ouvinte e faculta métodos vazios. Todos os eventos, ouvintes e adaptadores se encontram definidos no pacote org.eclipse.swt.events.
As tabelas seguinte resumem os eventos que estão disponíveis e os widgets que suportam cada evento. Os eventos podem ser divididos em duas categorias gerais: eventos de alto nível que representam uma operação lógica num controlo e eventos de baixo nível que descrevem interacções de utilizador mais específicas. Os eventos de alto nível podem ser representados por vários eventos de baixo nível que podem diferir por plataforma. Os eventos de baixo nível geralmente só devem ser usados em implementações de widgets personalizados.
Tipo de Evento |
Descrição |
---|---|
Activate, Deactivate | Gerado quando um Controlo é activado ou desactivado. |
Arm | Um MenuItem é armado (destacado e pronto a ser seleccionado). |
Close | Uma Shell vai ser fechada tal como solicitado pelo gestor de janelas. |
DefaultSelection | O utilizador selecciona um artigo invocando uma acção de selecção predefinida. Por exemplo, premindo Enter ou fazendo clique duas vezes numa linha de uma Tabela. |
Dispose | Um widget vai ser inutilizado, quer programaticamente quer pelo utilizador. |
DragDetect | O utilizador iniciou uma possível operação de arrastamento. |
EraseItem | O segundo plano de um TableItem ou TreeItem está prestes a ser concebido. |
Expand, Collapse | Um artigo numa Árvore está expandido ou contraído. |
Ajuda | O utilizador pediu ajuda para um widget. Por exemplo, isto ocorre quando se prime a tecla F1 em Windows. |
Iconify, Deiconify | Uma Shell foi minimizada, maximizada ou restaurada. |
MeasureItem | Está a ser solicitado o tamanho de um TableItem ou TreeItem personalizado. |
MenuDetect | O utilizador solicitou um menu de contexto. |
Modify | O texto do widget foi modificado. |
Move, Resize | Um controlo mudou de posição ou foi redimensionado, quer programaticamente quer pelo utilizador. |
PaintItem | O primeiro plano de um TableItem ou TreeItem está prestes a ser concebido. |
Selection | O utilizador selecciona um artigo no controlo. Por exemplo, fazendo clique numa linha de uma Tabela ou navegando com o teclado pelos artigos. |
SetData | É necessário definir dados num TableItem ao usar uma tabela virtual. |
Settings | Foi alterada uma propriedade do sistema operativo, tal como o tipo de letra ou a cor de um sistema. |
Show, Hide | A visibilidade de um controlo foi alterada. |
Traverse | O utilizador está a tentar atravessar o controlo com um batimento de tecla. Por exemplo, as teclas Escape ou Tab são usadas para travessias. |
Verify | O texto do widget vai ser modificado. Este evento dá à aplicação a hipótese de alterar o texto ou impedir a modificação. |
Tipo de Evento |
Descrição |
---|---|
FocusIn, FocusOut | Um controlo ganhou ou perdeu o foco. |
KeyDown, KeyUp | O utilizador premiu ou libertou uma tecla do teclado quando o controlo tem o foco do teclado. |
MouseDown, MouseUp, MouseDoubleClick | O utilizador premiu, libertou ou fez clique duas vezes no rato por cima do controlo. |
MouseMove | O utilizador moveu o rato por cima do controlo. |
MouseEnter, MouseExit, MouseHover | O rato entrou, saiu ou passou sobre o controlo. |
MouseWheel | A bola do rato foi rodada. |
Paint | O controlo foi danificado e precisa de nova pintura. |
Além do sistema de eventos com tipo acima descrito, o SWT suporta um mecanismo de eventos de widget sem tipo de baixo nível. O mecanismo sem tipo depende de uma constante para identificar o tipo de evento e define um ouvinte genérico que é facultado com esta constante. Isto permite ao ouvinte implementar um ouvinte de "estilo de maiúsculas/minúsculas". Na porção de código seguinte, definimos uma rotina de tratamento de eventos genéricos e adicionamos vários ouvintes a uma 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 ("Pintura recebida"); break; default: System.out.println ("Recebido evento desconhecido"); } } }; shell.addListener (SWT.Resize, listener); shell.addListener (SWT.Paint, listener);