Gerenciando eventos em aplicações gráficas no JAVA

A pergunta abaixo foi enviada por um aluno do curso de Sistemas de Informação da Universidade do Contestado – campus Concórdia; em relação a um exercício proposto na cadeira de Laboratório de Programação I:

“Jack, vc deixou para turma fazer um programa que calcula a média, mas eu não consigui fazer o botão “SAIR” funcionar, teria alguma dica?

Obrigado!”

No modelo de eventos suportado a partir da versão 1.1 de Java, um componente gráfico qualquer pode reconhecer alguma ação do usuário e a partir dela disparar um evento — indicando, por exemplo, que o botão do mouse foi pressionado ou que um texto foi modificado — que será capturado por um objeto registrado especificamente para registrar aquele tipo de evento ocorrido naquele componente. O pacote java.awt.event define as diversas classes de eventos que podem ocorrer através das interfaces gráficas.

Eventos gráficos são objetos derivados da classe AWTEvent, que por sua vez são derivados de objetos de evento genéricos definidos pela classe EventObject. Desta, eventos gráficos herdam o método getSource(), que permite identificar o objeto que deu origem ao evento. Eventos gráficos genéricos são especializados de acordo com o tipo de evento sob consideração — por exemplo, pressionar um botão do mouse gera um MouseEvent. A mesma ação sobre um botão, no entanto, gera também um ActionEvent, enquanto que sobre o botão de minimizar na barra de título de um frame gera um WindowEvent.

Outros eventos de interesse definidos em java.awt.event incluem ItemEvent, indicando que um item de uma lista de opções foi selecionado, TextEvent, quando o conteúdo de um componente de texto foi modificado, e KeyEvent, quando alguma tecla foi pressionada no teclado.A resposta que uma aplicação dá a qualquer evento que ocorre em algum componente gráfico é determinada por métodos específicos, registrados para responder a cada evento. O nome e a assinatura de cada um desses métodos é determinado por uma interface Java do tipo listener. Assim, para responder a um ActionEvent será utilizado o método definido na interface ActionListener; para responder a um WindowEvent, os métodos de WindowListener; e similarmente há interfaces ItemListener, TextListener e KeyListener. Os eventos do mouse são manipulados através de métodos especificados em duas interfaces, MouseListener (para ações sobre o mouse) e MouseMotionListener (para tratar movimentos realizados com o mouse).Apesar de existir um grande número de eventos e possibilidades de resposta que a aplicação poderia dar a cada um deles, cada aplicação pode especificar apenas aqueles para os quais há interesse que sejam tratados.

Para os eventos que o projetista da aplicação tem interesse de oferecer uma reação, ele deve definir classes manipuladoras de eventos (handlers), implementações de cada listener correspondente ao tipo de evento de interesse. Para interfaces listener que especificam diversos métodos, classes adaptadoras são definidas.Uma vez que uma classe handler tenha sido criada para responder aos eventos de um componente, é preciso associar esse componente ao objeto handler. Para tanto, cada tipo de componente gráfico oferece métodos na forma addXXXListener(XXXListener l) e removeXXXListener(XXXListener l), onde XXX está associado a algum evento do tipo XXXEvent. Por exemplo, para o componente Window (e por herança para todas os componentes derivados desse) são definidos os métodos:
public void addWindowListener(WindowListener l) e
public void removeWindowListener(WindowListener l),
pois nesse tipo de componente é possível ocorrer um WindowEvent.

Fonte do texto citato acima: http://www.dca.fee.unicamp.br/cursos/PooJava/graphic/events.html

A complexidade foi gerada de propósito no exercício proposto. Ao contrário do exemplo do “Jogo de Azar”, onde nós tínhamos basicamente um botão e, por tanto, tínhamos que tratar apenas o “evento” click (Action) deste único objeto; no exercício vcs tem dois botões e vão precisar descobrir que “evento click” de que “objeto” foi gerado.

Para tanto, vamos usar os métodos getSource().getText() do método actionPerformed(). Veja o código abaixo, no exemplo do “jogo de azar” como o tratamento é feito… Como podemos descobrir de que objeto o evento acontece!

//Início do código
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JogoAzar extends JFrame implements ActionListener
{
JButton botao, sair;
JPanel panel;
JLabel result, lb_aposta;
JTextField texto;

public JogoAzar()
{
super(“Jogo de Azar: Aposte em um número válido entre 0 e 9… www.JACK.eti.br”);
super.setSize(700,200);}public void criaJanela()
{
Font fontemaior = new Font(“Arial”, Font.BOLD, 20);
Font fontemedia = new Font(“Arial”, Font.BOLD, 15);
texto = new JTextField(“0”);
texto.setFont (fontemaior);
lb_aposta = new JLabel (“Qual a sua aposta?”);
lb_aposta.setFont (fontemedia);

panel = new JPanel();
panel.setLayout(new GridLayout(5, 1));botao = new JButton(“Jogar”);
botao.addActionListener(this);
sair = new JButton (“Sair”);
sair.addActionListener(this);result = new JLabel (“Aqui o resultado…”);
result.setForeground (Color.RED);
result.setFont(fontemaior);
result.setHorizontalAlignment(SwingConstants.CENTER);

panel.add(lb_aposta);
panel.add(texto);
panel.add(result);
panel.add(botao);
panel.add(sair);

getContentPane().add(panel, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

}

public void actionPerformed(ActionEvent event)
{
//Verificando aqui se o evento foi originado no objeto (botão) Jogar
if (((JButton)event.getSource()).getText() == “Jogar”) {
int aposta = Integer.parseInt (texto.getText());
if ((aposta < 0) || (aposta > 9)) {
JOptionPane.showMessageDialog(null, “Digite apenas números válidos! Entre 0 e 9!”, “Número Inválido”, JOptionPane.PLAIN_MESSAGE);
} else {
int aleatorio = (int) ((Math.random() * 100)/10);
if (aposta == aleatorio) {
result.setText (“Parabéns… Você acabou de ganhar! O resultado foi: ” + Integer.toString (aleatorio));
} else {
result.setText (“Que pena :(… Você Perdeu, tente novamente! O resultado foi: ” + Integer.toString (aleatorio));
}
}
//Caso contrário, verificando se o evento aconteceu no botão Sair
} else if (((JButton)event.getSource()).getText() == “Sair”) {
this.dispose(); //o método dispose() elimina da memória o instanciamento da janela
}
}

public static void main(String args[])
{
JogoAzar ambiente = new JogoAzar();
ambiente.criaJanela();
}
}
//Fim do código