Java - Tratamento de Eventos

De Aulas

Afluentes: Programação em Java

Eventos

Certos controles geram eventos:

  • Um evento indica a ocorrência de uma atuação do usuário sobre o controle ou alguma mudança interna que o afete;
  • Exemplos: clique de um botão, movimento do mouse, alteração do conteúdo de uma linha de edição, etc.

Resposta a eventos:

  • O desenvolvedor deve programar sua aplicação para responder aos eventos gerados sobre seus componentes;
  • Qualquer objeto pode responder a eventos;

Respondendo a Eventos

Um objeto pode se registrar para escutar eventos:

  • O objeto deve implementar uma interface específica;
  • O objeto deve se registrar no componente;
  • Diversos objetos podem ser registrados para o mesmo evento;
  • Um mesmo objeto pode tratar diversos eventos distintos.

Cada evento é representado por um objeto:

  • O objeto possui informações sobre o evento;
  • O objeto identifica o componente gerador do evento.

Principais Eventos e suas Interfaces

Ação do Usuário Interface
Clicar um botão ActionListener
Pressionar Enter em uma linha de texto ActionListener
Selecionar um item de menu ActionListener
Fechar uma janela WindowListener
Pressionar um botão do mouse MouseListener
Mover o mouse MouseMotionListener
Componente sendo apresentado ComponentListener
Componente ganha o foco do teclado FocusListener
Seleção de um item em uma lista ListSelectionListener

Exemplo

// ...
JButton botao = new JButton("Clique-me");
botao.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {
        JOptionPane.showMessageDialog(null, "Dados de entrada: " + entrada.getText(), "Informação", 0);
    }
});
// ...

Eventos de Ação

Interface ActionListener
  • Gerados por botões, menus e Enter em linhas de edição;
  • Registrada através do método addActionListener();
  • A interface possui um único método, actionPerformed();
  • O método recebe um objeto da classe ActionEvent.

Eventos de Teclado

Interface KeyListener
  • Evento de pressionamento e liberação de teclas;
  • Eventos são gerados pelo componente com o foco;
  • Registrada no componente pelo método addKeyListener;
  • Abaixo, são apresentados os métodos da interface:
public void keyTyped (KeyEvent e);
public void keyPressed (KeyEvent e);
public void keyReleased (KeyEvent e);
Classe KeyEvent
  • Informações adicionais dos eventos de teclado;
  • O método getKeyChar() retorna o caractere da tecla associada com o evento;
  • O método getKeyCode() retorna o código (Unicode) da tecla associada com o evento;
  • A classe KeyEvent define diversas constantes de código referentes às teclas associadas com o evento;
  • As constantes são iniciadas por VK (VK_A, VK_ESCAPE).

Eventos de Mouse

Interface MouseListener
  • Eventos de clique e liberação dos botões do mouse;
  • Eventos de entrada e saída do mouse de um componente;
  • Registrada no componente através de addMouseListener();
  • Abaixo, são apresentados os métodos da interface.
public void mousePressed (MouseEvent e);
public void mouseReleased (MouseEvent e);
public void mouseEntered (MouseEvent e);
public void mouseExited (MouseEvent e);
public void mouseClicked (MouseEvent e);
Classe MouseEvent
  • Representa os dados complementares do evento de mouse;
  • O método getClickCount() retorna o número de cliques consecutivos realizados pelo usuário;
  • Os métodos getX(), getY() e getPoint() retornam a posição do mouse, relativa ao componente afetado pelo evento;
  • O método getComponent() retorna o componente afetado pelo evento.
Interface MouseMotionListener
  • Eventos de movimento e arrastamento do mouse;
  • Registrada através do método addMouseMotionListener();
  • Abaixo, são apresentados os métodos da interface;
  • Os métodos utilizam objetos da classe MouseEvent.
public void mouseMoved (MouseEvent e);
public void mouseDragged (MouseEvent e);

Eventos de Seleção de Item

Interface ItemListener
  • Utilizado por check boxes e combos boxes;
  • Registrada através do método addItemListener();
  • A interface possui o método itemStateChanged();
  • O método recebe um objeto da classe ItemEvent;
  • A classe ItemEvent possui diversos métodos;
  • getItem() que retorna o item selecionado ou deselecionado;
  • getStateChange() determina o tipo do evento, que pode ser ItemEvent.SELECTED ou ItemEvent.DESELECTED.

Eventos de Janela

Interface WindowListener
  • Eventos de abertura, fechamento, ativação, desativação minimização e restauração de janelas ou diálogos;
  • Recebem um objeto da classe WindowEvent, que possui o método getWindow(), que retorna a janela do evento.
void windowOpened (WindowEvent);
void windowClosing (WindowEvent);
void windowClosed (WindowEvent);
void windowIconified (WindowEvent);
void windowDeiconified (WindowEvent);
void windowActivated (WindowEvent);
void windowDeactivated (WindowEvent);

Atividade

Usando a Interface desenvolvida na atividade de TableModel Java - Tabelas#Atividade, adicione eventos para incluir as informações das entradas de dados na tabela, altere as informações na própria tabela, exclua uma linha com a tecla DELETE e outras coisas mais.

Swing TableModel atividade01.png

Resolução

Classe Contato

 1public class Contato {
 2    private String nome;
 3    private int idade;
 4    private String telefone;
 5    private String email;
 6
 7    public Contato(String nome, int idade, String telefone, String email) {
 8        setNome(nome);
 9        setIdade(idade);
10        setTelefone(telefone);
11        setEmail(email);
12    }
13
14    public String getNome() {
15        return this.nome;
16    }
17
18    public void setNome(String nome) {
19        this.nome = nome;
20    }
21
22    public int getIdade() {
23        return this.idade;
24    }
25
26    public void setIdade(int idade) {
27        this.idade = idade;
28    }
29
30    public String getTelefone() {
31        return this.telefone;
32    }
33
34    public void setTelefone(String telefone) {
35        this.telefone = telefone;
36    }
37
38    public String getEmail() {
39        return this.email;
40    }
41
42    public void setEmail(String email) {
43        this.email = email;
44    }
45}

Classe ContatoTableModel

 1import java.util.ArrayList;
 2import java.util.List;
 3import javax.swing.table.AbstractTableModel;
 4
 5public class ContatoTableModel extends AbstractTableModel {
 6    private static final long serialVersionUID = 1L;
 7    private List<Contato> contatos = new ArrayList<Contato>();
 8    
 9    public void setContatos(List<Contato> contatos) {
10        this.contatos.clear();
11        this.contatos.addAll(contatos);
12        fireTableDataChanged();
13    }
14
15    public void addContato(Contato contato) {
16        contatos.add(contato);
17        fireTableDataChanged();
18    }
19
20    public Contato getContato(int idx) {
21        return contatos.get(idx);
22    }
23
24    public void delContato(int idx) {
25        contatos.remove(idx);
26        fireTableDataChanged();
27    }
28
29    public int getRowCount() {
30        return contatos.size();
31    }
32
33    public int getColumnCount() {
34        return 4;
35    }
36
37    public Object getValueAt(int rowIndex, int columnIndex) {
38        Contato c = contatos.get(rowIndex);
39        switch (columnIndex) {
40            case 0:
41                return c.getNome();
42            case 1:
43                return c.getIdade();
44            case 2:
45                return c.getTelefone();
46            case 3:
47                return c.getEmail();
48            default:
49                return null;
50        }
51    }
52
53    public String getColumnName(int columnIndex) {
54        switch (columnIndex) {
55            case 0:
56                return "Nome";
57            case 1:
58                return "Idade";
59            case 2:
60                return "Telefone";
61            case 3:
62                return "E-mail";
63            default:
64                return null;
65        }
66    }
67
68    public Class<?> getColumnClass(int columnIndex) {
69        switch (columnIndex) {
70            case 0:
71                return String.class;
72            case 1:
73                return Integer.class;
74            case 2:
75                return String.class;
76            case 3:
77                return String.class;
78            default:
79                return null;
80        }
81    }
82}

Classe Agenda

  1import java.util.ArrayList;
  2import java.util.List;
  3import java.awt.*;
  4import java.awt.event.*;
  5import javax.swing.*;
  6
  7public class Agenda extends JFrame {
  8    private static final long serialVersionUID = 1L;
  9    private final JTextField nome;
 10    private final JTextField idade;
 11    private final JTextField telefone;
 12    private final JTextField email;
 13
 14    public Agenda() {
 15        // Criar a interface visual
 16        super("Agenda Telefônica");
 17        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 18        setLayout(new BorderLayout());
 19
 20        JPanel entradas = new JPanel();
 21        entradas.setLayout(new GridLayout(0, 2));
 22
 23        entradas.add(new JLabel("Nome:"));
 24        nome = new JTextField(20);
 25        entradas.add(nome);
 26
 27        entradas.add(new JLabel("Idade:"));
 28        idade = new JTextField(20);
 29        entradas.add(idade);
 30
 31        entradas.add(new JLabel("Telefone:"));
 32        telefone = new JTextField(20);
 33        entradas.add(telefone);
 34
 35        entradas.add(new JLabel("E-mail:"));
 36        email = new JTextField(20);
 37        entradas.add(email);
 38
 39        final JButton btGravar = new JButton("Gravar");
 40        entradas.add(btGravar);
 41        
 42        final JButton btClear = new JButton("Limpar Campos");
 43        entradas.add(btClear);
 44
 45        add(entradas, BorderLayout.NORTH);
 46
 47        List<Contato> contatos = new ArrayList<Contato>();
 48        contatos.add(new Contato("Carlos", 25, "1234", "carlos@gmail.com"));
 49        contatos.add(new Contato("Juliana", 18, "3423423", "juliana@hotmail.com"));
 50        contatos.add(new Contato("John", 40, "3423234", "john@watson.com"));
 51
 52        ContatoTableModel ptm = new ContatoTableModel();
 53        ptm.setContatos(contatos);
 54        JTable tabela = new JTable();
 55        tabela.setModel(ptm);
 56        add(new JScrollPane(tabela), BorderLayout.CENTER);
 57
 58        // Gerenciamento dos eventos
 59        btGravar.addActionListener(new ActionListener() {
 60            @Override
 61            public void actionPerformed(ActionEvent e) {
 62                ptm.addContato(new Contato(
 63                    nome.getText(),
 64                    Integer.valueOf(idade.getText()),
 65                    telefone.getText(),
 66                    email.getText()
 67                ));
 68                clear();
 69            }
 70        });
 71
 72        btClear.addActionListener(new ActionListener() {
 73            @Override
 74            public void actionPerformed(ActionEvent e) {
 75                clear();
 76            }
 77        });
 78
 79        tabela.addMouseListener(new MouseListener() {
 80
 81            @Override
 82            public void mouseClicked(MouseEvent arg0) {
 83                Contato c = ptm.getContato(tabela.getSelectedRow());
 84                nome.setText(c.getNome());
 85                idade.setText("" + c.getIdade());
 86                telefone.setText(c.getTelefone());
 87                email.setText(c.getEmail());
 88            }
 89
 90            @Override
 91            public void mouseEntered(MouseEvent arg0) {
 92            }
 93
 94            @Override
 95            public void mouseExited(MouseEvent arg0) {
 96            }
 97
 98            @Override
 99            public void mousePressed(MouseEvent arg0) {
100            }
101
102            @Override
103            public void mouseReleased(MouseEvent arg0) {
104            }
105        });
106
107        tabela.addKeyListener(new KeyListener() {
108
109            @Override
110            public void keyPressed(KeyEvent arg0) {
111                ptm.delContato(tabela.getSelectedRow());
112                clear();
113            }
114
115            @Override
116            public void keyReleased(KeyEvent arg0) {
117            }
118
119            @Override
120            public void keyTyped(KeyEvent arg0) {
121            }
122            
123        });
124
125        pack();
126        setVisible(true);
127    }
128
129    private void clear() {
130        nome.setText("");
131        idade.setText("");
132        telefone.setText("");
133        email.setText("");
134    }
135
136    public static void main(String[] args) {
137        new Agenda();
138    }
139}