Eventos, listeners e classes de adaptadores

Os eventos JavaBeans são sinalizados quando ocorre uma atividade, como um botão sendo pressionado ou uma janela sendo fechada. O editor visual para Java mostra eventos na visualização Java Beans, que pode ser utilizada para incluir e remover eventos.

A lista de eventos definidos para um JavaBean é descrita em sua classe BeanInfo, que também controla os eventos comumente utilizados ou preferidos.

É possível incluir um evento em um JavaBean se você quiser que algo aconteça quando o JavaBean for gerado, como uma atualização de banco de dados quando um botão é pressionado. O Java Bean que está criando o evento é a origem e o objeto que é chamado de volta quando o evento é criado é conhecido como listener. Cada JavaBean tem uma interface que permite que ele notifique os listeners para cada evento e também os métodos para incluir e remover os listeners.

Geralmente, se o JavaBean de origem tem um método XXX, há uma interface de listener, XXXListener, e dois métodos. É importante que XXXListener estenda java.util.EventListener. Se isso não acontecer, e a menos que um BeanInfo específico seja fornecido, o evento não será descoberto.

Os métodos na interface XXXListener em si dependem da semântica do evento, mas a convenção é que sua assinatura seja void <eventOccurenceMethodName>(<EventStateObjectType> evt);. É importante que XXXListener estenda java.util.EventObject. Se isso não acontecer, e a menos que um BeanInfo específico seja fornecido, o evento não será descoberto.

Um exemplo de um evento é o JavaBean java.awt.Component, que cria eventos quando o mouse se move sobre ele. A interface do listener, java.awt.event.MouseMotionListener, implementa os dois métodos a seguir:

Para incluir um listener de mouse, o java.awt.Component possui os dois métodos a seguir:

O segundo estilo do evento é gerado por um JavaBean quando o valor de uma propriedade é alterado. Um exemplo disso é a propriedade 'enabled' em javax.swing.JButton. Uma propriedade que lança um evento quando seu valor é alterado é conhecida como propriedade do limite. Em vez de ter uma interface de listener separada para cada propriedade do limite, há uma interface de listener genérica java.beans.PropertyChangeListener que tem um método único de retorno de chamada void propertyCanged(PropertyChangeEvent evt); O argumento PropertyChangeEvent tem três métodos que podem ser consultados pelo receptor do método:  

String getPropertyName() O nome da propriedade que foi alterada no JavaBean que fez com que o evento fosse lançado
Object getNewValue() O novo valor da propriedade
Object getOldValue() O valor da propriedade antes de ser alterado

Para registrar interesse nas alterações de propriedade de um JavaBean há dois métodos: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

O primeiro desses métodos está sempre presente em um JavaBean que tem propriedades do limite. Porém, o segundo é opcional e depende do estilo do registro de evento utilizado pelo autor do JavaBean. Por exemplo, os componentes AWT utilizam o primeiro estilo do registro de alteração de propriedade, enquanto os componentes Swing utilizam os dois estilos.

Para utilizar um evento há três objetos:

  1. O JavaBean que cria o evento ( a origem )
  2. A classe que recebe a notificação da origem ( o listener )
  3. A classe que implementa a lógica que ocorre quando o listener é chamado de volta.

Geralmente, os dois últimos são combinados, para que a classe que executa a lógica implemente diretamente a interface de listener ou utilize uma classe interna. Os estilos de código que o editor visual para Java reconhece e gera são abrangidos na seção em Geração de Códigos de Eventos.

Classes do adaptador

Muitas interfaces de listener têm mais de um método de retorno de chamada. Um exemplo é java.awt.FocusListener que tem dois métodos; focusGained(java.awt.FocusEvent event) e focusLost(java.awt.FocusEvent event). Ao criar uma classe de listener que implementa a interface, o compilador Java insiste que todos os métodos da interface sejam implementados, o que freqüentemente resulta em muitos métodos vazios sendo criados para satisfazer seus requisitos quando apenas um ou alguns de seus métodos realmente contêm código. A instrução a seguir mostra um FocusListener sendo utilizado para executar alguma lógica quando um Java bean obtém foco. Porém, um método focusLost vazio deve ser fornecido.

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

Para evitar ter muitos métodos de listener vazios para muitos listeners, são fornecidas as classes Adaptador. Estas implementam a interface de listener e fornecem implementação no-op vazia de seus métodos. A vantagem é que o listener pode estendê-las e especializar apenas métodos de opções sem precisar fornecer implementações padrão para o restante ( estas são herdadas do Adaptador ).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });

O editor visual consegue reconhecer e trabalhar com classes Adaptador e a seção Eventos BeanInfo descreve como é possível associar classes Adaptador para seus próprios eventos ao editor visual.

Tópico pai: Manipulando Eventos com o Editor Visual

(C) Copyright IBM Corporation 1999, 2004. Todos os Direitos Reservados.