Programação

Propaganda
Programação
Na Web
Gestão de eventos do
Rato e teclado
António Gonçalves
1
Agenda
• Estratégia Geral de gestão de eventos
• Gestão de eventos em listeners distintos
• Gestão de eventos através do uso de
interfaces
• Gestão de eventos pelo uso de classes
internas
• Gestão de eventos pelo uso de classes
anónimas
• Tipos de listener
2
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
1
Passos
1. Determinara qual o tipo de evento
–
Existem mais de 11 tipos distintos de eventos
•
ActionListener, AdjustmentListener, ComponentListener,
ContainerListener, FocusListener, ItemListener, KeyListener,
MouseListener, MouseMotionListener, TextListener,
WindowListener
2. Definir uma classe que possa processar um
evento
–
–
Implementar uma interface (KeyListener, MouseListener, etc.)
Extender uma classe (KeyAdapter, MouseAdapter, etc.)
3. Registo de um objecto da classe definida na
janela
–
3
w.addXxxListener(new MyListenerClass());
Gestão de •
Eventosi.e., addKeyListener, addMouseListener
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Num Listener distinto
• Listener não precisam chamar qualquer
método da janela a que estão associados.
import java.applet.Applet;
import java.awt.*;
public class ClickReporter extends Applet {
public void init() {
setBackground(Color.yellow);
addMouseListener(new ClickListener());
}
}
4
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
2
Gestão de Eventos:
Num Listener distinto (cont.)
import java.awt.event.*;
public class ClickListener extends MouseAdapter {
public void mousePressed(MouseEvent event) {
System.out.println("Mouse pressed at (" +
event.getX() + "," +
event.getY() + ").");
}
}
5
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Generalização
• Pretendemos que quando o evento
ClickListener acontecer seja desenhado um
circulo
• Usar getGraphics para obter um objecto
• Solução:
– Chamar event.getSource para obter uma referencia da
janela ou componente GUI no qual é gerado o evento
– Converter o resultado para o tipo certo
– Chamar o método nesta referencia
6
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
3
Gestão de Eventos:
Num Listener distinto
import java.applet.Applet;
import java.awt.*;
public class CircleDrawer1 extends Applet {
public void init() {
setForeground(Color.blue);
addMouseListener(new CircleListener());
}
}
7
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Num Listener distinto (cont.)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class CircleListener extends MouseAdapter {
private int radius = 25;
public void mousePressed(MouseEvent event) {
Applet app = (Applet)event.getSource();
Graphics g = app.getGraphics();
g.fillOval(event.getX()-radius,
event.getY()-radius,
2*radius,
2*radius);
}
8
}
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
4
Gestão de Eventos:
Num Listener distinto (resultado)
9
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Implementação de uma interface
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class CircleDrawer2 extends Applet
implements MouseListener {
private int radius = 25;
public void init() {
setForeground(Color.blue);
addMouseListener(this);
}
10
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
5
Gestão de Eventos:
Implementação de uma interface (cont.)
public
public
public
public
void
void
void
void
mouseEntered(MouseEvent event) {}
mouseExited(MouseEvent event) {}
mouseReleased(MouseEvent event) {}
mouseClicked(MouseEvent event) {}
public void mousePressed(MouseEvent event) {
Graphics g = getGraphics();
g.fillOval(event.getX()-radius,
event.getY()-radius,
2*radius,
2*radius);
}
Obrigatório a
Implementações de
toda a interface
}
11
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Definição de classe interna
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class CircleDrawer3 extends Applet {
public void init() {
setForeground(Color.blue);
addMouseListener(new CircleListener());
}
Definição de uma classe no interior
de outra, permite a classe interna ter
acesso os métodos da classe externa.
12
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
6
Gestão de Eventos:
Definição de classe interna (cont.)
• Nota: Continuação da classe do slide anterior
private class CircleListener
extends MouseAdapter {
private int radius = 25;
public void mousePressed(MouseEvent event) {
Graphics g = getGraphics();
g.fillOval(event.getX()-radius,
event.getY()-radius,
2*radius,
2*radius);
}
}
}
13
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Definição de classe anonima interna
public class CircleDrawer4 extends Applet {
public void init() {
setForeground(Color.blue);
addMouseListener
(new MouseAdapter() {
private int radius = 25;
public void mousePressed(MouseEvent event) {
Graphics g = getGraphics();
g.fillOval(event.getX()-radius,
event.getY()-radius,
2*radius,
2*radius);
}
});
}
14
}
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
7
Estrategias de gestão de eventos:
Ben. e Desv.
• Listener separado
– Vantagens
• Pode ignorar eventos que não ser quer processar
• Uma classe distinta é mais fácil de gerir
– Desvantagens
• Necessita de uma passo extra para invocar os métodos no
janela principal
• implementação de uma interface
– Vantagens
• Não necessita de passos adicionais para invocar os métodos
– Desvantagens
• Tem que implementar todos os métodos de uma interface
15
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Estrategias de tratamento de
eventos: Ben. e Desv., cont.
• Classe interna
– Vantagens
• Não é necessário implementar métodos para todos os eventos
• Não necessita fazer chamada ao método
– Desvantagens
• um pouco confuso
• Classe interna anónima
– Vantagens
• Não é necessário implementar métodos para todos os eventos
• Código mais compacto
– Desvantagens
• De difícil compreensão
16
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
8
Lista de eventos
(Sumário)
Listener
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener
17
Adapter Class
(If Any)
ComponentAdapter
ContainerAdapter
FocusAdapter
KeyAdapter
MouseAdapter
MouseMotionAdapter
WindowAdapter
Gestão de Eventos
Registration Method
addActionListener
addAdjustmentListener
addComponentListener
addContainerListener
addFocusListener
addItemListener
addKeyListener
addMouseListener
addMouseMotionListener
addTextListener
addWindowListener
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Eventos do Rato
• MouseListener e MouseMotionListener partilham o
mesmo tipo de evento
• Localização dos clicks
– event.getX() e event.getY()
• Clicks Duplos
– Determinado pelo OS, não, pelo programador
– Chamada event.getClickCount()
• Distinção dos botões do rato
18
– Chamar event.getModifiers() e comparar com
MouseEvent.Button2_MASK para click no botão do meio
MouseEvent.Button3_MASK para click no botão de esquerda
– pode também gerir evento: Shift-click, Alt-click,
etc.
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
9
Correção da Escrita: Textfield
• KeyListener corrige a escrita
• ActionListener completa uma palavra com ENTER
• FocusListener indica alternativas
19
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Quadro de Desenho
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class SimpleWhiteboard extends Applet {
protected int lastX=0, lastY=0;
public void init() {
setBackground(Color.white);
setForeground(Color.blue);
addMouseListener(new PositionRecorder());
addMouseMotionListener(new LineDrawer());
}
20
protected void record(int x, int y) {
lastX = x; lastY = y;
}
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
10
Quadro de Desenho(Continuação)
private class PositionRecorder extends MouseAdapter {
public void mouseEntered(MouseEvent event) {
requestFocus(); // Plan ahead for typing
record(event.getX(), event.getY());
}
public void mousePressed(MouseEvent event) {
record(event.getX(), event.getY());
}
}
...
21
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Quadro de Desenho(Continuação)
//Quando o Utilizador arrasta o rato são desenhas segmentos de linhas
private class LineDrawer extends MouseMotionAdapter {
public void mouseDragged(MouseEvent event) {
int x = event.getX();
int y = event.getY();
Graphics g = getGraphics();
g.drawLine(lastX, lastY, x, y);
record(x, y);
}
}
}
22
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
11
Quadro de Desenho (Resultado)
23
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Quadro de Desenho:
Eventos do Teclado (adicionar texto)
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Whiteboard extends SimpleWhiteboard {
protected FontMetrics fm;
public void init() {
super.init();
Font font = new Font("Serif", Font.BOLD, 20);
setFont(font);
fm = getFontMetrics(font);
addKeyListener(new CharDrawer());
}
24
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
12
Quadro de Desenho:
Eventos do Teclado (adicionar texto)(cont.)
...
private class CharDrawer extends KeyAdapter {
// When user types a printable character,
// draw it and shift position rightwards.
public void keyTyped(KeyEvent event) {
String s = String.valueOf(event.getKeyChar());
getGraphics().drawString(s, lastX, lastY);
record(lastX + fm.stringWidth(s), lastY);
}
}
}
25
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Whiteboard (Results)
26
Gestão de Eventos
http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
13
Download