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.
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}