1 António Gonçalves
Programação
Na Web
Gestão de eventos do
Rato e teclado
Gestão de Eventos 2 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htmAgenda
•
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
Gestão de Eventos
3 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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
– w.addXxxListener(new MyListenerClass()); • i.e., addKeyListener, addMouseListener
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());
} }
Gestão de Eventos
5 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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() + ")."); } } Gestão de Eventos 6 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
Gestão de Eventos
7 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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());
} }
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); }
Gestão de Eventos
9 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Num Listener distinto (resultado)
Gestão de Eventos
10 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);
Gestão de Eventos
11 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Gestão de Eventos:
Implementação de uma interface (cont.)
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void 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
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.
Gestão de Eventos
13 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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); } } } Gestão de Eventos 14 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); } }); } }
Gestão de Eventos
15 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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
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
Gestão de Eventos
17 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Lista de eventos
(Sumário)
Adapter Class
Listener (If Any) Registration Method
ActionListener addActionListener AdjustmentListener addAdjustmentListener ComponentListener ComponentAdapter addComponentListener ContainerListener ContainerAdapter addContainerListener FocusListener FocusAdapter addFocusListener ItemListener addItemListener KeyListener KeyAdapter addKeyListener MouseListener MouseAdapter addMouseListener MouseMotionListener MouseMotionAdapter addMouseMotionListener TextListener addTextListener
WindowListener WindowAdapter addWindowListener
Gestão de Eventos
18 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
– 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
Gestão de Eventos
19 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Correção da Escrita: Textfield
•
KeyListener corrige a escrita
•
ActionListener completa uma palavra com ENTER
•
FocusListener indica alternativas
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());
}
protected void record(int x, int y) { lastX = x; lastY = y;
Gestão de Eventos
21 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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()); } } ... Gestão de Eventos 22 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);
} } }
Gestão de Eventos
23 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
Quadro de Desenho (Resultado)
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());
Gestão de Eventos
25 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm
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); } } } Gestão de Eventos 26 http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm