2. Eventos
Eventos em Java são objetos
Subclasses de java.util.EventObject
Todo evento tem um objeto que é sua fonte
Object fonte = evento.getSource();
Métodos de ouvintes (listeners) que desejam tratar
eventos, recebem eventos como argumento
public void eventoOcorreu(EventObject evento) {
Object fonte = evento.getSource();
System.out.println("" +evento+ " em " +fonte);
}
Ouvintes precisam ser registrados nas fontes
Quando ocorre um evento, um método de todos os ouvintes
registrados é chamado e evento é passado como argumento
4. Exemplo (1/3)
... (não esqueça dos imports)
public class Janela extends JFrame {
private JButton b1 = new JButton("Ligar");
private JButton b2 = new JButton("Desligar");
public Janela(String nome) {
super(nome);
this.setLayout(new GridLayout(2,1));
this.add(b1);
this.add(b2);
OuvinteBotao ouvinteBotao = new OuvinteBotao();
OuvinteMouse ouvinteMouse = new OuvinteMouse();
b1.addActionListener(ouvinteBotao);
b2.addActionListener(ouvinteBotao);
b2.addMouseListener(ouvinteMouse);
this.setSize(400,350); this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_C
LOSE);
}
... (crie um main para iniciar a janela)
5. Exemplo (2/3)
public class OuvinteBotao implements ActionListener{
public void actionPerformed(ActionEvent e) {
System.out.println("tarefa do botao");
}
}
6. Exemplo (3/3)
...
public class OuvinteMouse implements MouseListener {
public void mouseClicked(MouseEvent e) {
System.out.println("clicou o mouse!");
}
public void mousePressed(MouseEvent e) {
System.out.println("pressionou o mouse!");
}
public void mouseReleased(MouseEvent e) {
System.out.println("soltou o mouse!");
}
public void mouseEntered(MouseEvent e) {
System.out.println("mouse sobre a área!");
}
public void mouseExited(MouseEvent e) {
System.out.println("mouse saiu da área!");
}
}
7. Tipos de Eventos
Herdam da classe java.awt.event.AWTEvent, são
divididos em categorias (java.awt.event) e os
principais são:
ActionEvent (componentes de ação)
MouseEvent (componentes afetados pelo mouse)
ItemEvent (checkboxes radios e outros)
AdjustmentEvent (scrollbars)
TextEvent (componentes de texto)
WindowEvent (janelas)
FocusEvent (componentes em geral)
“...Event”
8. Listeners
Cada evento tem uma interface Listener correspondente
ActionEvent: ActionListener
MouseEvent: MouseListener e
MouseMotionListener
ItemEvent: ItemListener
AdjustmentEvent: AdjustmentListener
TextEvent: TextListener
WindowEvent: WindowListener
FocusEvent: FocusListener
“...Event”: “...Listener”
9. Fonte x Listener
Quando ocorre um evento todos os listeners registrados
são notificados
Para registrar um listener na fonte:
fonte.add<Listener>(referência_para_listener);
Exemplo:
JButton button = new JButton("Fonte");
ActionListener ouvinte1 = new OuvinteDoBotao();
MouseListener ouvinte2 = new
OuvinteDeCliques();
button.addActionListener(ouvinte1);
button.addMouseListener(ouvinte2);
Um objeto pode ser fonte e listener ao mesmo tempo
this.addWindowListener(this);
10. Implementando um Listener
Em uma classe declare implementar os listeners dos
eventos que voce vai escutar
public class MeuListener implements
ActionListener, ItemListener { ... }
Implemente os métodos da interface
public void actionPerformed(ActionEvent e) {...}
public void itemStateChanged(ItemEvent e) {...}
DICAS:
Todos os métodos são public void
Todos recebem o tipo de evento correspondente ao tipo do
listener como argumento
11. Listeners e métodos
Cada listener possui métodos que você deve implementar:
public void actionPerformed(ActionEvent evt)
Cada evento possui métodos que você pode chamar
dentro do listener para obter as informações desejadas:
String comando = actionEvent.getActionCommand();
Componente (fonte) possui métodos que você pode
chamar para obter informações sobre ele:
Object fonte = evento.getSource();
if (fonte instanceof JButton) {
JButton b = (JButton) fonte;
String label = b.getLabel();
}
12. Exemplo (1/3)
... (não esqueça dos imports)
public class Janela extends JFrame implements
WindowListener{
private JButton b1 = new JButton("Click!");
public Janela(String nome) {
super(nome);
this.setSize(400,300);
this.setLayout(null);
this.add(b1);
b1.setBounds(10, 100, 150, 50);
OuvinteMouse ouvinteMouse = new OuvinteMouse();
b1.addMouseListener(ouvinteMouse);
this.addWindowListener(this);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_C
LOSE);
this.setVisible(true);
}
13. Exemplo (2/3)
public void windowOpened(WindowEvent e) {
System.out.println("Janela aberta!"); }
public void windowClosing(WindowEvent e) {
System.out.println("Fechado Janela!"); }
public void windowClosed(WindowEvent e) {
System.out.println("Janela Fechada!"); }
public void windowIconified(WindowEvent e) {
System.out.println("Janela minimizada!"); }
public void windowDeiconified(WindowEvent e) {
System.out.println("Janela Restaurada!"); }
public void windowActivated(WindowEvent e) {
System.out.println("Janela Ativada!"); }
public void windowDeactivated(WindowEvent e) {
System.out.println("Janela Desativada!"); }
... (crie um main para iniciar a janela)
14. Exemplo (3/3)
...
public class OuvinteMouse implements MouseListener {
...
public void mouseEntered(MouseEvent e) {
System.out.println("mouse sobre o botao!");
Object fonte = e.getSource();
if (fonte instanceof JButton) {
JButton b = (JButton) fonte;
if (b.getLocation().getX() == 10){
b.setLocation(200, 100);
b.setText("Tente novamente!");
}else{
b.setLocation(10, 100);
b.setText("Click!");
}
}
}
...
}
16. Adapters
Alguns listeners possuem uma classe Adapter
Implementa todos os métodos, sem instruções, ou seja,
implementação vazia: {}
Existem apenas para listeners que têm mais de um método
Úteis quando um Ouvinte precisa implementar apenas um
dentre vários métodos de um Listener
Pode sobrepor a implementação desejada do método do
Adapter e não precisa se preocupar com os outros
Não são úteis em ouvintes que já estendem outras classes
ou quando implementam diferentes listeners
Alguns Adapters:
MouseListener: MouseAdapter
WindowListener: WindowAdapter
“...Listener”: “...Adapter”
17. Tratamento de eventos com classes internas
É comum utilizar-se classes anônimas no tratamento de
eventos de uma GUI
Uma das grandes vantagens é a possibilidade de enxergar
os componentes que geralmente são atributos private
Exemplo:
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand());
} } );
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf.setText(e.getActionCommand());
} } ); ( ... )
18. Exercício
1. Implemente os eventos para a aplicação
Copiar deve acrescentar o texto do JTextField
noJEditorPane e limpar o JTextField
Limpar deve limpar o JTextField
Sair deve sair do programa
2. Implemente os botões como itens do menu
"Operações"
Use JMenuBar, JMenu e JMenuItem
3. Implemente um JToggleButton "desenhar/escrever"
que troque o JTextPane por um JCanvas e permita
rabiscar com o mouse (use MouseEvent)