Eventos

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

Eventos não digitados

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);