Eventos

Depois de criarmos uma visualizaçã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 listener, haverá um adaptador (XyzAdapter) que implementa a interface do listener e fornece métodos vazios. 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. Os eventos podem ser divididos em duas categorias gerais: eventos de alto nível que representam uma operação lógica em um controle e eventos de baixo nível que descrevem interações mais específicas do usuário. Os eventos de alto nível podem ser representados por múltiplos eventos de baixo nível, os quais podem diferir por plataforma. Geralmente, os eventos de baixo nível apenas devem ser utilizados para implementações de widgets customizados.

Eventos de Alto Nível

Tipo de Evento

Descrição

Activate, Decativate Gerado quando um Control está ativado ou desativado.
Arm Um MenuItem é ativado (realçado e pronto para ser selecionado).
Close Uma Shell está prestes a ser fechada como solicitado pelo gerenciador de janelas.
DefaultSelection O usuário seleciona um item chamando uma ação de seleção padrão. Por exemplo, pressionando Enter ou dando um clique duplo em uma linha em uma Table.
Dispose Um widget está prestes a ser descartado, de forma programática ou pelo usuário.
DragDetect O usuário iniciou uma possível operação de arrastar.
Expand, Collapse Um item em uma Tree é expandido ou reduzido.
Help O usuário iniciou a ajuda solicitada para um widget. Por exemplo, isso ocorre quando a tecla F1 é pressionada no Windows.
Iconify, Deiconify Uma Shell foi minimizada, maximizada ou restaurada.
MenuDetect O usuário solicitou um menu de contexto.
Modify O texto do widget foi modificado.
Move, Resize Um controle alterou a posição ou foi redimensionado, de forma programática ou pelo usuário.
Selection O usuário seleciona um item no controle. Por exemplo, clicando uma vez em uma linha em uma Table ou pelo teclado navegando através dos itens.
SetData Os dados precisam ser configurados em um TableItem ao utilizarem uma tabela virtual.
Show, Hide A visibilidade de um controle foi alterada.
Traverse O usuário está tentando atravessar o controle utilizando um pressionamento de tecla. Por exemplo, as teclas de escape ou tab são utilizadas para passagem.
Verify Um texto do widget está prestes a ser modificado. Esse evento dá ao aplicativo a chance de alterar o texto ou evitar a modificação.

Eventos de Baixo Nível

Tipo de Evento

Descrição

FocusIn, FocusOut Um controle ganha ou perde foco.
KeyDown, KeyUp O usuário pressionou ou liberou uma tecla do teclado, quando o controle possui foco de teclado.
MouseDown, MouseUp, MouseDoubleClick O usuário pressionou, liberou ou clicou duas vezes com o mouse sobre o controle.
MouseMove O usuário moveu o mouse sobre o controle.
MouseEnter, MouseExit, MouseHover O mouse entrou, saiu ou foi passado sobre o controle.
MouseWheel A roda do mouse foi girada.
Paint O controle foi danificado e requer redesenho.

Eventos não digitados

Além do sistema de evento digitado descrito acima, o SWT suporta um mecanismo de evento do widget de baixo nível e não digitado. 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);