TA345/531 TP257 Informática Aplicada à Engenharia de Alimentos.


Aula 05: Parte A - WINDOW TOOLKIT

O que é um Evento?

 

De forma simplificada, um evento é uma ação executada nos objetos existentes no programa. Por exemplo, sabe quando você posiciona o mouse em cima de uma palavra (Label) e aparece uma legenda explicativa sobre essa palavra? Então, posicionar o mouse em cima da palavra é um evento, e aparecer a legenda explicativa sobre a palavra é uma resposta ao evento.

 

Todos os objetos estão sujeitos a um evento. Um objeto que recebe eventos e responde a eles é chamado de detector de eventos. Os detectores de eventos são necessários para implementar interfaces que definem formalmente o modo como os eventos serão recebidos e processados.

 

Cada tipo de evento tem uma espécie de biblioteca que é capaz de reconhecer e responder a eventos, essas "bibliotecas" são denominadas interface do detector de eventos. Eventos relacionados são geralmente agrupados em uma única interface do detector de eventos, sendo que as mais usadas são: KeyListener, MouseListener, MouseMotionListener, WindowListener, ActionListener, ItemListener.

 

Cada interface apresenta o que chamamos de métodos de resposta definidos da Interface, que são "rotinas padrões" para atender aos eventos mais comuns.

 

Rotinas da interface MouseListener

 

mouseClicked( )

usuário clicou o mouse.

mousePressed( )

usuário pressionou o botão do mouse (mas ainda não o soltou).

mouseReleased( )

usuário liberou o botão do mouse.

mouseEntered( )

seta do mouse entrou na janela do applet.

mouseExited( )

seta do mouse saiu da janela do applet.

 

Para consultar sobre outros métodos que atendem aos eventos, procure pela bibliografia indicada para o curso.

 

As ferramentas de controle de janelas do Java também conhecidas por AWT (Abstract Window Toolkit) são uns dos pontos fortes do java.

 

Estas ferramentas fornecem toda a funcionalidade que se podia esperar de um sistema moderno de janelas. O AWT contém os mais usados componentes das interfaces gráficas atuais, portanto habilita a aplicação a ser executada em sistemas gráficos completamente diferentes.

 

Apresentaremos os seguintes componentes: Buttom, Canvas, Checkbox, Container, Label, List, Scrollbar e TextComponent. Para um bom entendimento destes componentes é necessário primeiro ter uma base sobre manuseio de eventos.

 

5.1. Eventos

 

Um evento é uma comunicação do mundo externo para o programa que alguma coisa aconteceu. Podemos citar como exemplo o clique ou ainda o movimento do mouse. Uma das coisas mais importantes a se entender sobre o AWT é como é feito o manuseio/tratamento destes eventos. Sem eventos, sua aplicação não poderia responder às ações do usuário.

 

 Exemplo – clique2:

import java.applet.*;

 import java.awt.*;

 import java.awt.event.*;

 

 public class clique2 extends Applet implements ActionListener

 {

     Label titulo;

     TextField caixa1, caixa;

     Button botao,botao1;

     public void init()

     {

         titulo = new Label("Botão Exemplo");

         titulo.setForeground (Color.red);         add(titulo);

         botao = new Button("Clique em mim");         add(botao);

         botao.addActionListener(this);

         caixa= new TextField ("          ",10);         add (caixa);

         botao1 = new Button(" Não clique em mim");         add(botao1);

         botao1.addActionListener(this);

         caixa1= new TextField ("          ",6);         add (caixa1);

     }

 

     public void actionPerformed(ActionEvent e)

     {

         if (e.getSource() == botao)

         {

         caixa.setText("Muito Obrigado!");

         }

         if (e.getSource() == botao1)

         {

         caixa1.setText("BUMMMM!");

         }

     }

 }

 

 

Exemplo – clique3:

 import java.applet.Applet;

 import java.applet.*;

 import java.awt.*;

 import java.awt.event.*;

 

 public class clique3 extends Applet implements ActionListener

 {

     Label titulo;

     TextField caixa1;

     Button botao;   ;

     public void init()

     {

         titulo = new Label("Botão Exemplo");

         titulo.setForeground (Color.red);         add(titulo);

         botao = new Button("Clique em mim");         add(botao);

         botao.addActionListener(this);

         caixa1= new TextField ("          ",16);         add (caixa1);

     }

     public void actionPerformed(ActionEvent e)

     {

         if (e.getSource() == botao)

         {

         caixa1.setText("Muito Obrigado!");

         botao.setLabel("OK!!");

         }

     }

 }

 

 

Quando um componente com uma ação associada é manipulado pelo usuário, o método action( ) daquele componente é chamado. Neste caso, nós estamos usando um botão ao invés de usar uma subclasse de nossa autoria. O tratador de eventos tenta tratar o evento dentro da classe botão, mas como ele não acha o tratador que iria manusear o evento, ele passa o evento para o container que contém o componente e assim por diante até que alguém trate o evento.

 

Vamos dar uma olhada de perto no método action( ):

public boolean action(Event evt, Object algm) {

Todos tratadores de eventos têm uma forma similar a esta. Eles aceitam um parâmetro do tipo Event, que promove informação detalhada sobre o evento. Segundo, eles retornam um valor Boolean, indicando True se o evento foi tratado, ou False caso contrário.

if (evt.target = = botão) {

Aqui o alvo do evento é checado para saber se é ou não o botão. Já que evt.target e botão são objetos, nós podemos checar se ambos são o mesmo objeto.

botão.setLabel(“OK!!”);

Já que o botão foi pressionado, vamos mudar o seu título.

return true;

}

else return false;

Finalmente, se o evento foi tratado é retornado true; caso contrário, é retornado false.

 

5.1.1. Tratamento de eventos em detalhe

 

Em quase todos os casos, podemos usar os métodos tratadores de eventos, que são fornecidos na linguagem Java. Estes estão na tabela abaixo. Mas lembre-se que tudo é relativo ao componente. Por exemplo, o método mouseMove( ) de um componente é chamado quando o mouse é movido dentro daquele componente.

 

Eventos do Java:

 

Tipo

Método

Ação tomada

Botão do mouse pressionado

Botão do mouse liberado

Movimento do mouse

Arrasto do mouse

Mouse entra em componente

Mouse sai de componente

Tecla pressionada

Tecla liberada

action(Event evt, Object algum)

mouseDown(Event evt, int x, int y)

mouseUp(Event evt, int x, int y)

mouseMove(Event evt, int x, int y)

mouseDrag(Event evt, int x, int y)

mouseEnter(Event evt, int x, int y)

mouseExit(Event evt, int x, int y)

keyDown(Event evt, int key)

keyUp(Event evt, int key)

 

Quando você deve usar outros métodos em detrimento do action( )? A resposta é: quando você quer trocar o comportamento do componente, action( ) não é suficiente. Ele apenas reporta eventos que são essenciais para o componente como um clique do mouse num botão. Vamos adicionar ao programa do exemplo anterior algumas mudanças de comportamento:

 

Exemplo - ex5_2:

import java.awt.*;

import java.applet.Applet;

public class ex5_2 extends Applet

{

  Button botao;

  TextField pontuacao;

  int pontos=0;

  public void init( )

  {

    botao = new Button("Clique aqui!        "); add(botao);

  }

  public boolean mouseEnter(Event evt, int x, int y)

  {

    botao.setLabel("Está longe!"); return true;

  }

  public boolean mouseExit(Event evt, int x, int y)

  {

    botao.setLabel("Clique ou retorne!"); return true;

  }

  public boolean action (Event evt, Object algum)

  {

    if (evt.target == botao)

    {

      botao.setLabel("Acertou!"); return true;

    }

    else return false;

  }

}

 

 

Exemplo - ex5_2b:

import java.awt.*;

import java.applet.Applet;

public class ex5_2b extends Applet

{

  Button botao;

  TextField pontuacao;

  int pontos=0;

  public void init( )

  {

    botao = new Button("Clique aqui!             "); add(botao);

  }

  public boolean mouseEnter(Event evt, int x, int y)

  {

    botao.setLabel("Está longe!"); return true;

  }

 

  public boolean mouseMove(Event evt, int x, int y)

  {

    botao.setLabel("Está longe: "+x+"-"+y); return true;

  }

 

  public boolean mouseExit(Event evt, int x, int y)

  {

    botao.setLabel("Clique ou retorne!"); return true;

  }

  public boolean action (Event evt, Object algum)

  {

    if (evt.target == botao)

    {

      botao.setLabel("Acertou!"); return true;

    }

    else return false;

  }

}

 

 

Exemplo - ex5_2c:

import java.awt.*;

import java.applet.Applet;

public class ex5_2c extends Applet

 

{

  Button botao, botao1;

  TextField pontuacao;

 

  int pontos=0;

  public void init( )

 

  {

    botao = new Button("Clique aqui!        "); add(botao);

    botao1 = new Button ("Não, clique aqui!         "); add(botao1);

  }

 

  public boolean mouseEnter(Event evt, int x, int y)

 

  {

    botao.setLabel("Está longe!");

    botao1.setLabel("Está frio!");

    return true;

  }

 

  public boolean mouseExit(Event evt, int x, int y)

 

  {

    botao.setLabel("Clique ou retorne!");

    botao1.setLabel("Ainda não clicou?");

    return true;

  }

 

  public boolean action (Event evt, Object algum)

  {

    if (evt.target == botao)

    {

      botao.setLabel("Acertou!"); return true;

    }

 

    else

    if (evt.target == botao1)

      {botao1.setLabel("Aleluia!"); return true;

      }

    else return false;

  }

}

 

 

Agora, o usuário é instigado a não clicar no botão. Antes, o botão era usado de uma maneira completamente normal, agora nós mudamos seu comportamento/funcionalidade.

 

5.1.2. handleEvent( ) ou action( )

 

Geralmente, uma combinação do método action( ) com outros tratadores de eventos pré-construídos trabalharão bem. Para aquelas vezes em que você necessita tomar um controle completo, handleEvent( ) é usado. O método handieEvent( ) tem vantagens e desvantagens. No lado positivo, você é quem tem o controle completo. E no lado negativo, visto que é você quem tem o controle completo, você deve ter muito cuidado quando está montando um handleEvent( ), ou sua aplicação pode começar a ficar confusa e cheia de bugs rapidamente.

 

public boolean mouseEnter (Event evt, int x, int y) { setText(“Sai fora!!”); }

public boolean handleEvent (Event evt)

{

if (evt.id = = KEY_PRESS)

{

setText(“Pressionado”);

return true;

}

else

return false;

}

 

Eventos do AWT:

 

Tipo

Método

Ação tomada

Botão do mouse pressionado

Arrasto do mouse

Mouse entra em componente

Mouse sai de componente

Botão do mouse liberado

Movimento do mouse

Tecla pressionada

Tecla liberada

ACTION_EVENT

MOUSE_DOWN

MOUSE_DRAG

MOUSE_ENTER

MOUSE_EXIT

MOUSE_UP

MOUSE_MOVED

KEY_PRESS

KEY_RELEASE

 

5.1.3. Como criar eventos

 

Ocasionalmente, o programa tem que criar seus próprios eventos. Pode até parecer estranho, mas, às vezes, o programa fica muito mais simples. Um simples evento pode ser criado assim:

Event evt = new Event(obj_alvo, id, arg);

Onde obj_alvo é o objeto para o qual o evento deve ser mandado, id é um inteiro que representa o tipo do evento (pode-se usar as constantes acima) e arg é um argumento para ser incluído no evento se há alguma informação extra que você gostaria que o tratador de eventos recebesse.

 

Normalmente, a definição de um evento é feita como o exemplo abaixo:

public boolean keyDown(Event evt, int key)

{

if (key == 49)

{

deliverEvent(new Event(oneKey, Event.MOUSE_DOWN, null) ) ;

return true;

}

...

}

 

5.1.4. Foco

 

Quando um usuário clica em um componente da interface, este item fica “selecionado”. Quando um text field é selecionado, o usuário pode digitar no campo de texto.

 

Quando um componente recebe o foco, o método getFocus( ) do componente é chamado:

public boolean getFocus(Event evt, Object what)

{

}

Quando um componente perde o foco, o método lostFocus( ) do componente é chamado:

public boolean lostFocus(Event evt, Object what)

{

}

 

É comum em um programa a necessidade de manter o foco em determinado componente. Por exemplo, em um text field para mostrar dados e não para receber dados, você provavelmente não quer que o text field esteja apto a receber o foco. Para este caso existe o método requestFocus( ):

public void requestFocus( )

{

...

}

Isto pode ser colocado em um componente que contém o textfield para que este componente fique com o foco.


Volta para a pagina principal

 

Última atualização:  27/março/2009