Classes de eventos, ouvintes e adaptadores

Os eventos JavaBeans são assinalados quando ocorre uma actividade como, por exemplo, um botão a ser premido ou uma janela a ser fechada. O editor visual para Java mostra eventos na vista Java Beans, e pode utilizar esta vista para adicionar e remover eventos.

A lista de eventos definidos para um JavaBean está descrita na respectiva classe BeanInfo, que também controla os eventos mais utilizados ou preferidos.

Poderá optar por adicionar um evento a um JavaBean se quiser desencadear uma acção quando o JavaBean for gerado como, por exemplo, uma actualização de base de dados quando se premir um botão. O Java Bean que desencadeia o evento é a origem, e o objecto que é chamado quando o evento é desencadeado é conhecido como ouvinte. Cada JavaBean tem uma interface que lhe permite notificar os ouvintes de cada evento, bem como métodos para adicionar e remover ouvintes.

Regra geral, se o JavaBean origem for um método XXX, existe uma interface de ouvinte, XXXListener, e dois métodos. É importante que XXXListener possa expandir java.util.EventListener. Se não puder, e a menos que seja fornecida uma BeanInfo específica, o evento não será descoberto.

Os métodos na interface XXXListener propriamente dita dependem da semântica do evento, mas a convenção dita que a assinatura seja void <eventOccurenceMethodName>(<EventStateObjectType> evt);. É importante que XXXListener possa expandir java.util.EventObject. Se não puder, e a menos que seja fornecida uma BeanInfo específica, o evento não será descoberto.

Um exemplo de evento é o JavaBean java.awt.Component, que desencadeia eventos quando o rato passa sobre ele. A interface de ouvinte, java.awt.event.MouseMotionListener, implementa os seguintes dois métodos:

Para adicionar um ouvinte de rato, o java.awt.Component tem os dois métodos seguintes:

O segundo estilo de evento é gerado por um JavaBean quando um valor de propriedade for alterado. Um exemplo disto é a propriedade 'activada' em javax.swing.JButton. Uma propriedade que desencadeie um evento quando o respectivo valor for alterado chama-se propriedade associada. Em vez de ter uma interface de ouvinte separada para cada propriedade associada, existe uma interface de ouvinte genérica, java.beans.PropertyChangeListener que tem um único método de chamada de retorno, 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 desencadeou o evento
Object getNewValue() O novo valor da propriedade
Object getOldValue() O valor da propriedade antes de ser alterada

Para registar interesse nas alterações à propriedade do JavaBean, existem dois métodos: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

O primeiro destes métodos está sempre presente num JavaBean que tenha propriedades associadas. Todavia, o segundo é opcional e depende do estilo do registo de eventos utilizado pelo autor do JavaBean. Por exemplo, os componentes AWT utilizam o primeiro estilo de registo de alterações de propriedades, ao passo que os componentes de Swing utilizam ambos os estilos.

Para utilizar um evento há três objectos:

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

Geralmente, os últimos dois estão combinados, de modo a que a classe que executa a lógica implementa a interface de ouvinte directamente ou utiliza uma classe interna. Os estilos de código que o editor visual para Java reconhece e gera estão explicados na secção sobre Geração de Código de Eventos.

Classes de adaptadores

Muitas interfaces ouvintes têm mais de um método de chamada de retorno. 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 ouvinte que implemente a interface, o compilador Java insiste que todos os métodos da interface sejam implementados, o que geralmente resulta em muitos métodos vazios criados para satisfazer os respectivos requisitos, quando só um ou alguns métodos contém realmente código. A instrução seguinte mostra um FocusListener utilizado para realizar lógica quando um Java bean ganha foco. Todavia, deve ser facultado um método focusLost vazio.

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 ouvintes vazios para muitos ouvintes, são facultadas Classes de adaptadores. Estas implementam a interface de ouvinte, e facultam uma implementação vazia dos seus métodos. A vantagem consiste em que o ouvinte pode expandi-las, e especializar somente métodos escolhidos sem ter de facultar implementações predefinidas para os restantes (herdados do Adaptador).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Tarefas relacionadas
Ver eventos para um componente
Adicionar eventos a um componente
Eliminar eventos de um componente
Ver o código fonte de um evento

(C) Copyright IBM Corporation 1999, 2004. Todos os direitos reservados.