SWING - Tratamento de Eventos

Neste capítulo, você aprenderá sobre Eventos, seus tipos e também aprenderá como lidar com um evento. Um exemplo é fornecido no final do capítulo para melhor compreensão.

O que é um evento?

A mudança no estado de um objeto é conhecida como Event, ou seja, o evento descreve a mudança no estado da fonte. Os eventos são gerados como resultado da interação do usuário com os componentes da interface gráfica do usuário. Por exemplo, clicar em um botão, mover o mouse, inserir um caractere pelo teclado, selecionar um item da lista e rolar a página são as atividades que fazem com que um evento ocorra.

Tipos de evento

Os eventos podem ser amplamente classificados em duas categorias -

  • Foreground Events- Esses eventos requerem interação direta do usuário. Eles são gerados como consequências da interação de uma pessoa com os componentes gráficos na Interface Gráfica do Usuário. Por exemplo, clicar em um botão, mover o mouse, inserir um caractere pelo teclado, selecionar um item da lista, rolar a página, etc.

  • Background Events- Esses eventos requerem a interação do usuário final. Interrupções do sistema operacional, falha de hardware ou software, expiração do temporizador e conclusão da operação são alguns exemplos de eventos em segundo plano.

O que é manipulação de eventos?

Manipulação de eventos é o mecanismo que controla o evento e decide o que deve acontecer se um evento ocorrer. Este mecanismo possui um código conhecido como manipulador de eventos, que é executado quando ocorre um evento.

Java usa o modelo de evento de delegação para lidar com os eventos. Este modelo define o mecanismo padrão para gerar e tratar os eventos.

O modelo de evento de delegação tem os seguintes participantes principais.

  • Source- A fonte é um objeto no qual o evento ocorre. Source é responsável por fornecer informações do evento ocorrido ao seu manipulador. Java nos fornece classes para o objeto de origem.

  • Listener- Também é conhecido como manipulador de eventos. O ouvinte é responsável por gerar uma resposta a um evento. Do ponto de vista da implementação Java, o ouvinte também é um objeto. O ouvinte espera até receber um evento. Depois que o evento é recebido, o ouvinte processa o evento e retorna.

O benefício dessa abordagem é que a lógica da interface do usuário é completamente separada da lógica que gera o evento. O elemento da interface do usuário é capaz de delegar o processamento de um evento a uma parte separada do código.

Neste modelo, o ouvinte precisa ser registrado com o objeto de origem para que possa receber a notificação do evento. Essa é uma maneira eficiente de lidar com o evento porque as notificações de evento são enviadas apenas para os ouvintes que desejam recebê-las.

Etapas envolvidas no tratamento de eventos

Step 1 - O usuário clica no botão e o evento é gerado.

Step 2 - O objeto da classe de evento em questão é criado automaticamente e as informações sobre a fonte e o evento são preenchidas dentro do mesmo objeto.

Step 3 - O objeto de evento é encaminhado para o método da classe de ouvinte registrada.

Step 4 - O método é executado e retorna.

Pontos a serem lembrados sobre o ouvinte

  • Para projetar uma classe de ouvinte, você deve desenvolver algumas interfaces de ouvinte. Essas interfaces de ouvinte prevêem alguns métodos de retorno de chamada abstratos públicos, que devem ser implementados pela classe de ouvinte.

  • Se você não implementar nenhuma das interfaces predefinidas, sua classe não poderá atuar como uma classe de ouvinte para um objeto de origem.

Métodos de retorno de chamada

Esses são os métodos fornecidos pelo provedor de API e definidos pelo programador do aplicativo e invocados pelo desenvolvedor do aplicativo. Aqui, os métodos de retorno de chamada representam um método de evento. Em resposta a um evento, java jre irá disparar o método de retorno de chamada. Todos esses métodos de retorno de chamada são fornecidos em interfaces de ouvinte.

Se um componente deseja que algum ouvinte ouça seus eventos, a fonte deve se registrar no ouvinte.

Exemplo de manipulação de eventos

Crie o seguinte programa Java usando qualquer editor de sua escolha em dizer D:/ > SWING > com > tutorialspoint > gui >

SwingControlDemo.java

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;

   public SwingControlDemo(){
      prepareGUI();
   }
   public static void main(String[] args){
      SwingControlDemo swingControlDemo = new SwingControlDemo();  
      swingControlDemo.showEventDemo();       
   }
   private void prepareGUI(){
      mainFrame = new JFrame("Java SWING Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));

      headerLabel = new JLabel("",JLabel.CENTER );
      statusLabel = new JLabel("",JLabel.CENTER);        
      statusLabel.setSize(350,100);
      
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      controlPanel = new JPanel();
      controlPanel.setLayout(new FlowLayout());

      mainFrame.add(headerLabel);
      mainFrame.add(controlPanel);
      mainFrame.add(statusLabel);
      mainFrame.setVisible(true);  
   }
   private void showEventDemo(){
      headerLabel.setText("Control in action: Button"); 

      JButton okButton = new JButton("OK");
      JButton submitButton = new JButton("Submit");
      JButton cancelButton = new JButton("Cancel");

      okButton.setActionCommand("OK");
      submitButton.setActionCommand("Submit");
      cancelButton.setActionCommand("Cancel");

      okButton.addActionListener(new ButtonClickListener()); 
      submitButton.addActionListener(new ButtonClickListener()); 
      cancelButton.addActionListener(new ButtonClickListener()); 

      controlPanel.add(okButton);
      controlPanel.add(submitButton);
      controlPanel.add(cancelButton);       

      mainFrame.setVisible(true);  
   }
   private class ButtonClickListener implements ActionListener{
      public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();  
         
         if( command.equals( "OK" ))  {
            statusLabel.setText("Ok Button clicked.");
         } else if( command.equals( "Submit" ) )  {
            statusLabel.setText("Submit Button clicked."); 
         } else {
            statusLabel.setText("Cancel Button clicked.");
         }  	
      }		
   }
}

Compile o programa usando o prompt de comando. Vamos paraD:/ > SWING e digite o seguinte comando.

D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java

Se nenhum erro ocorrer, significa que a compilação foi bem-sucedida. Execute o programa usando o seguinte comando.

D:\AWT>java com.tutorialspoint.gui.SwingControlDemo

Verifique a seguinte saída.