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