Java GUI: Events, Listeners e Handlers com JFrame, JButton e JTextField (Projeto Completo)

Java GUI: Events, Listeners e Handlers na Prática com Swing

Aprender Java GUI significa aprender a trabalhar com eventos. Afinal, toda interface gráfica depende da interação do usuário: cliques em botões, textos digitados, teclas pressionadas e janelas abertas ou fechadas.

Neste tutorial vamos aprender na prática como funcionam Events, Listeners e Handlers, criando um jogo de adivinhação usando JFrame, JButton, JLabel e JTextField.

O que são Events, Listeners e Handlers?

Aplicações gráficas utilizam o modelo de programação orientada a eventos (Event Driven Programming).

O funcionamento é simples:

  1. O usuário realiza uma ação.
  2. Um evento é gerado.
  3. Um Listener detecta esse evento.
  4. Um Handler executa alguma ação.

Por exemplo, ao clicar em um botão, um objeto ActionEvent é criado e enviado para um ActionListener.

Projeto: Jogo de Adivinhação

Nosso programa irá gerar um número aleatório entre 1 e 1000.

O jogador deverá informar palpites até encontrar o número correto.

Após cada tentativa, o sistema fornecerá dicas informando se o número procurado é maior ou menor.

Componentes Utilizados

  • JFrame — Janela principal da aplicação
  • JLabel — Exibe mensagens na tela
  • JTextField — Campo para digitação
  • JButton — Botões de ação
  • ActionListener — Escuta eventos
  • ActionEvent — Representa um evento ocorrido

📚 Estudando Java?

Se você está aprendendo Java, Swing, Orientação a Objetos e desenvolvimento de aplicações desktop, confira o Mega Pack do Projeto Progressivo.

Mega Pack Projeto Progressivo

👉 Conheça o Mega Pack Completo

Código Completo da Classe Principal

A classe principal cria a janela e exibe a aplicação:

import javax.swing.JFrame;

public class GuessTheNumber
{
    public static void main(String[] args)
    {
        window mainWindow = new window();

        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(400,150);
        mainWindow.setVisible(true);
    }
}

Criando a Classe Window

A classe window herda de JFrame, tornando-se uma janela gráfica do Swing:

public class window extends JFrame
{
}

Import necessário:

import javax.swing.JFrame;

Declarando os Componentes da Interface

private JButton generateButton;
private JButton guessButton;
private JTextField textField;
private JLabel guess;
private int number;

Esses objetos representam todos os elementos gráficos utilizados pelo programa.

Gerando um Número Aleatório

O método abaixo gera um número entre 1 e 1000:

public void generate()
{
    Random gen = new Random();
    number = gen.nextInt(1000) + 1;
}

Import necessário:

import java.util.Random;

Configurando o JFrame

Dentro do construtor configuramos o título da janela e o layout:

public window()
{
    super("Adivinhe o Número");

    setLayout(new FlowLayout());

    generate();
}

Import necessário:

import java.awt.FlowLayout;

Adicionando o JTextField

textField = new JTextField(27);
add(textField);

O JTextField será utilizado para receber os palpites do jogador.

Capturando Eventos com ActionListener

Sempre que o usuário pressionar Enter ou clicar em um botão, um ActionEvent será disparado.

public void actionPerformed(ActionEvent event)
{
}

Imports necessários:

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

Criando o Handler

O Handler será responsável por processar todos os eventos da aplicação.

public class Handler implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent event)
    {
        // tratamento dos eventos
    }
}

Capturando o Valor Digitado

if(event.getSource() == textField)
{
    test(
        Integer.parseInt(
            event.getActionCommand()
        )
    );
}

O método getActionCommand() retorna o conteúdo digitado pelo usuário.

Criando o Botão Testar

guessButton = new JButton("Testar");

guessButton.addActionListener(handler);

add(guessButton);

Criando o Botão Gerar Outro Número

generateButton = new JButton("Gerar Outro Número");

generateButton.addActionListener(handler);

add(generateButton);

Lógica Principal do Jogo

A validação do palpite fica concentrada em um único método:

public void test(int attemp)
{
    if(attemp < number)
    {
        JOptionPane.showMessageDialog(
            window.this,
            "Errou. O número é maior."
        );
    }
    else if(attemp > number)
    {
        JOptionPane.showMessageDialog(
            window.this,
            "Errou. O número é menor."
        );
    }
    else
    {
        JOptionPane.showMessageDialog(
            window.this,
            "Parabéns, você acertou!"
        );

        textField.setEditable(false);
    }
}

Import necessário:

import javax.swing.JOptionPane;

Versão Moderna com Lambda (Java 8+)

Atualmente é comum substituir classes Handler por expressões lambda:

guessButton.addActionListener(e ->
{
    int attemp = Integer.parseInt(
        textField.getText()
    );

    test(attemp);
});

Essa abordagem reduz a quantidade de código e facilita a manutenção da aplicação.

Conclusão

Neste projeto você aprendeu os principais fundamentos do desenvolvimento de interfaces gráficas com Java Swing:

  • JFrame
  • JLabel
  • JTextField
  • JButton
  • ActionListener
  • ActionEvent
  • Handlers
  • Programação orientada a eventos

Esses conceitos formam a base para aplicações desktop mais avançadas, incluindo sistemas comerciais, ferramentas administrativas, jogos simples e aplicações corporativas.

Um comentário:

Anônimo disse...

Show