Programação Na Web Gestão de eventos do Rato e teclado 1 António Gonçalves 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 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 w.addxxxlistener(new MyListenerClass()); i.e., addkeylistener, addmouselistener 3 Gestão de Eventos Gestão de Eventos: Num Listener distinto Listener não precisam chamar qualquer método da janela a que estão associados. public class ClickReporter extends Applet { setbackground(color.yellow); addmouselistener(new ClickListener()); 4 Gestão de Eventos 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 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 3
Gestão de Eventos: Num Listener distinto public class CircleDrawer1 extends Applet { setforeground(color.blue); addmouselistener(new CircleListener()); 7 Gestão de Eventos Gestão de Eventos: Num Listener distinto (cont.) 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 4
Gestão de Eventos: Num Listener distinto (resultado) 9 Gestão de Eventos Gestão de Eventos: Implementação de uma interface import java.awt.event.*; public class CircleDrawer2 extends Applet implements MouseListener { private int radius = 25; setforeground(color.blue); addmouselistener(this); 10 Gestão de Eventos 5
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 11 Gestão de Eventos Gestão de Eventos: Definição de classe interna import java.awt.event.*; public class CircleDrawer3 extends Applet { 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 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 Gestão de Eventos: Definição de classe anonima interna public class CircleDrawer4 extends Applet { 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 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 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 8
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 17 Gestão de Eventos 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 pode também gerir evento: Shift-click, Alt-click, etc. 18 Gestão de Eventos 9
Correção da Escrita: Textfield KeyListener corrige a escrita ActionListener completa uma palavra com ENTER FocusListener indica alternativas 19 Gestão de Eventos Quadro de Desenho import java.awt.event.*; public class SimpleWhiteboard extends Applet { protected int lastx=0, lasty=0; setbackground(color.white); setforeground(color.blue); addmouselistener(new PositionRecorder()); addmousemotionlistener(new LineDrawer()); protected void record(int x, int y) { lastx = x; lasty = y; 20 Gestão de Eventos 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 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 11
Quadro de Desenho (Resultado) 23 Gestão de Eventos Quadro de Desenho: Eventos do Teclado (adicionar texto) import java.awt.event.*; public class Whiteboard extends SimpleWhiteboard { protected FontMetrics fm; super.init(); Font font = new Font("Serif", Font.BOLD, 20); setfont(font); fm = getfontmetrics(font); addkeylistener(new CharDrawer()); 24 Gestão de Eventos 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 Whiteboard (Results) 26 Gestão de Eventos 13