Download - Intercettare gli eventi di mouse e tastiera

Transcript
Page 1: Intercettare gli eventi di mouse e tastiera

1

© 2007 Marty Hall

Customized J2EE Training: http://courses.coreservlets.com/Servlets, JSP, Struts, JSF, EJB3, Ajax, Java 5, Java 6, etc. Ruby/Rails coming soon.

Developed and taught by well-known author and developer. At public venues or onsite at your location.

Intercettare gli eventi del Mouse e della tastiera

Originals of Slides and Source Code for Examples:http://courses.coreservlets.com/Course-Materials/java5.html

Traduzione a cura di Javastaff.com

Page 2: Intercettare gli eventi di mouse e tastiera

2 J2EE training: http://courses.coreservlets.com

Agenda

• Strategie generali di gestione degli eventi• Gestire gli eventi con listeners separati• Gestire gli eventi con le interfacce• Gestire gli eventi con le inner classes• Gestire gli eventi con le inner classes

anonime• I tipi standard di listener AWT• Finezze con gli eventi del mouse• Esempi

Page 3: Intercettare gli eventi di mouse e tastiera

3 J2EE training: http://courses.coreservlets.com

Strategia Generale

• Determinare quale tipo di listener ci interessa– 11 tipi standard di listener in AWT descritti nelle

prossime slides:• ActionListener, AdjustmentListener, ComponentListener,

ContainerListener, FocusListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener, WindowListener

• Definire una classe del tipo scelto– Implement interface (KeyListener, MouseListener, etc.)– Extend class (KeyAdapter, MouseAdapter, etc.)

• Registrare un’istanza del vostro listener nella window– w.addXxxListener(new MyListenerClass());

• Es: addKeyListener, addMouseListener

Page 4: Intercettare gli eventi di mouse e tastiera

4 J2EE training: http://courses.coreservlets.com

Gestire gli eventi con un Listener separato: caso semplice

• Il Listener non ha bisogno di chiamare nessun metodo della window al quale è associata

import java.applet.Applet;import java.awt.*;

public class ClickReporter extends Applet { public void init() { setBackground(Color.YELLOW); addMouseListener(new ClickListener()); }}

Page 5: Intercettare gli eventi di mouse e tastiera

5 J2EE training: http://courses.coreservlets.com

Listener Separato: Caso Semplice (Continua)import java.awt.event.*;

public class ClickListener extends MouseAdapter { public void mousePressed(MouseEvent event) { System.out.println("Mouse pressed at (" + event.getX() + "," + event.getY() + ")."); }}

Page 6: Intercettare gli eventi di mouse e tastiera

6 J2EE training: http://courses.coreservlets.com

Generalizzando il caso semplice

• Come implementare un ClickListener per disegnare un cerchio ogni volta che il mouse è cliccato?

• Perchè non possiamo semplicemente chiamare getGraphics per ottenere un oggetto Graphics con il quale disegnare?

• Soluzione Generale:– Invocare event.getSource per ottenere un riferimento ad

un componente window o GUI dal quale è originato l’evento

– Eseguire un cast sul risultato ottenendo il tipo di interesse– Invocare i metodi di questo oggetto

Page 7: Intercettare gli eventi di mouse e tastiera

7 J2EE training: http://courses.coreservlets.com

Gestire gli Eventi con un listener Separato: Caso Generaleimport java.applet.Applet;import java.awt.*;

public class CircleDrawer1 extends Applet { public void init() { setForeground(Color.BLUE); addMouseListener(new CircleListener()); }}

Page 8: Intercettare gli eventi di mouse e tastiera

8 J2EE training: http://courses.coreservlets.com

Gestire gli Eventi con un listener Separato: Caso Generale (Continua)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); }}

Page 9: Intercettare gli eventi di mouse e tastiera

9 J2EE training: http://courses.coreservlets.com

Gestire gli Eventi con un listener Separato: Caso Generale (Risultato)

Page 10: Intercettare gli eventi di mouse e tastiera

10 J2EE training: http://courses.coreservlets.com

Caso 2: Implementare un’iterfaccia Listenerimport 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); }

Page 11: Intercettare gli eventi di mouse e tastiera

11 J2EE training: http://courses.coreservlets.com

Implementare un’iterfaccia Listener (Continua)

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); }}

Page 12: Intercettare gli eventi di mouse e tastiera

12 J2EE training: http://courses.coreservlets.com

Adapters vs. Interfacce: Errori di Signature dei metodi

• Cosa succede se si sbaglia la signature del metodo?– public void mousepressed(MouseEvent e)– public void mousePressed()

• Interfacce– Errori a tempo di compilazione

• Adapters– Nessun errore di compilazione ma non accade nulla a run time

quando si preme il mouse

• Soluzioen per gli adapters: le annotation @Override– Ogni volta che pensate di stare eseguendo un override di un metodo,

scrivete "@Override" sulla linea precedente l’inizio di tale metodo.• Se il metodo non sta effettivamente eseguendo l’override,

otterrete un errore di compilazione.

Page 13: Intercettare gli eventi di mouse e tastiera

13 J2EE training: http://courses.coreservlets.com

Esempio di @Override

public class CircleDrawer1 extends Applet { @Override public void init() { setForeground(Color.BLUE); addMouseListener(new CircleListener()); }}

public class CircleListener extends MouseAdapter { private int radius = 25; @Override 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); }}

Page 14: Intercettare gli eventi di mouse e tastiera

14 J2EE training: http://courses.coreservlets.com

Caso 3: Named Inner Classes

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()); }

Page 15: Intercettare gli eventi di mouse e tastiera

15 J2EE training: http://courses.coreservlets.com

Named Inner Classes (Continua)

• Nota: ancora parte della classe della slide precedente

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); } }}

Page 16: Intercettare gli eventi di mouse e tastiera

16 J2EE training: http://courses.coreservlets.com

Caso 4: Inner Classes Anonime

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); } }); }}

Page 17: Intercettare gli eventi di mouse e tastiera

17 J2EE training: http://courses.coreservlets.com

Strategie di gestione eventi: Pro e Contro

• Listener Separato– Vantaggi

• Puo’ estendere un adapter ignorandone i metodi inutili• Classi separate sono più semplici da manutenere

– Svantaggi• Necessita di passi extra per invocare metodi nella finestra

principale

• Window principale che implementa l’interfaccia– Vantaggi

• Nessun passo extra per invocare metodi nella finestra principale

– Svantaggi• Bisogna implementare tutti i metodi, anche quelli non utili

Page 18: Intercettare gli eventi di mouse e tastiera

18 J2EE training: http://courses.coreservlets.com

Strategie di gestione eventi: Pro e Contro (Continua)

• Named inner class– Vantaggi

• Possono estendere gli adapters e quindi ignorare i metodi non utilizzati

• Nessun passo extra per invocare metodi nella finestra principale

– Svantaggi• Un po’ più complesso da capire

• Inner class anonime– Vantaggi

• Gli stessi delle named inner classes• Anche più veloce

– Svantaggi• Molto più complesso da capire

Page 19: Intercettare gli eventi di mouse e tastiera

19 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Sommario)

Adapter ClassListener (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

Page 20: Intercettare gli eventi di mouse e tastiera

20 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Dettagli)

• ActionListener– Gestisce i bottoni e qualche altra azione

• actionPerformed(ActionEvent event)

• AdjustmentListener– Per gestire lo scrolling

• adjustmentValueChanged(AdjustmentEvent event)

• ComponentListener– Gestisce lo spostamento/ il resize/l’hide degli oggetti GUI

• componentResized(ComponentEvent event)• componentMoved (ComponentEvent event)• componentShown(ComponentEvent event)• componentHidden(ComponentEvent event)

Page 21: Intercettare gli eventi di mouse e tastiera

21 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Dettagli)

• ContainerListener– Invocato quando una window aggiunge/rimuove controlli

GUI• componentAdded(ContainerEvent event)• componentRemoved(ContainerEvent event)

• FocusListener– Notifica quando un controllo ottiente/perde il focus della

tastiera• focusGained(FocusEvent event)• focusLost(FocusEvent event)

Page 22: Intercettare gli eventi di mouse e tastiera

22 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Dettagli)

• ItemListener– Gestisce la selezione in liste, checkboxes, etc.

• itemStateChanged(ItemEvent event)

• KeyListener– Intercetta gli eventi della tastiera

• keyPressed(KeyEvent event) -- any key pressed down• keyReleased(KeyEvent event) -- any key released• keyTyped(KeyEvent event) -- key for printable char released

Page 23: Intercettare gli eventi di mouse e tastiera

23 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Dettagli)

• MouseListener– Per gestire gli eventi base del mouse

• mouseEntered(MouseEvent event)• mouseExited(MouseEvent event)• mousePressed(MouseEvent event)• mouseReleased(MouseEvent event)• mouseClicked(MouseEvent event)

– Rilasciato senza trascinamento. Non usare al posto di mousePressed!– Si applica al release se non c’è stato movimento

• MouseMotionListener– Gestisce i movimenti del mouse

• mouseMoved(MouseEvent event)• mouseDragged(MouseEvent event)

• MouseInputListener– Combina MouseListener e MouseMotionListener

• Nel package javax.swing.event, non in java.awt.event • Bisogna chiamare sia addMouseListener che

addMouseMotionListener, quindi non si risparmia molto in tempo

Page 24: Intercettare gli eventi di mouse e tastiera

24 J2EE training: http://courses.coreservlets.com

Listener di Eventi Standard AWT (Dettagli)

• TextListener– Gestisce gli eventi di Textfields e text areas

• textValueChanged(TextEvent event)

• WindowListener– Gestisce gli eventi ad alto livello degli eventi di window

• windowOpened, windowClosing, windowClosed, windowIconified, windowDeiconified, windowActivated, windowDeactivated

– windowClosing particolarmente utile

Page 25: Intercettare gli eventi di mouse e tastiera

25 J2EE training: http://courses.coreservlets.com

Eventi del Mouse: Dettagli

• MouseListener e MouseMotionListener condividono i tipi di eventi

• Location del click– event.getX() e event.getY()– Si puo’ usare anche la classe MouseInfo per ottenere la

poszione del mouse • Doppio click

– Determinato dal OS, non dal programmatore– Invocare event.getClickCount()

• Distinguere i bottoni del mouse– Invocare event.getModifiers() e comparare con le MASK

MouseEvent.Button2_per il tasto centrale e MouseEvent.Button3_per il tasto destro.

– Si puo’ anche catturare le combinazioni Shift-click, Alt-click..

Page 26: Intercettare gli eventi di mouse e tastiera

26 J2EE training: http://courses.coreservlets.com

Esempio semplice: Spelling-Correcting Textfield

• KeyListener corregge lo spelling durante la scrittura

• ActionListener completa le parole alla pressione di ENTER

• FocusListener fornisce suggerimenti

Page 27: Intercettare gli eventi di mouse e tastiera

27 J2EE training: http://courses.coreservlets.com

Esempio: Semplice Lavagna

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; }

Page 28: Intercettare gli eventi di mouse e tastiera

28 J2EE training: http://courses.coreservlets.com

Esempio: Semplice Lavagna

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()); } } ...

Page 29: Intercettare gli eventi di mouse e tastiera

29 J2EE training: http://courses.coreservlets.com

Esempio: Semplice Lavagna

... 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); } }}

Page 30: Intercettare gli eventi di mouse e tastiera

30 J2EE training: http://courses.coreservlets.com

Esempio: Semplice Lavagna

Page 31: Intercettare gli eventi di mouse e tastiera

31 J2EE training: http://courses.coreservlets.com

Lavagna: Aggiungere gli eventi della tastieraimport 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()); }

Page 32: Intercettare gli eventi di mouse e tastiera

32 J2EE training: http://courses.coreservlets.com

Lavagna (Continua)

... 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); } }}

Page 33: Intercettare gli eventi di mouse e tastiera

33 J2EE training: http://courses.coreservlets.com

Lavagna (Results)

Page 34: Intercettare gli eventi di mouse e tastiera

34 J2EE training: http://courses.coreservlets.com

Sommario

• Stategie generali– Determinare il tipo di listener da utilizzare

• Controllare la tavola dei tipi standard– Definire una classe di quel tipo

• Estendere gli adapter separatamente, implementare un interfaccia, estendere gli adapter in una named inner class o in una inner class anonima

– Registrare un’istanza della vostra classe listener nella window

• Invocare addXxxListener

• Comprendere i listeners– i metodi hanno comportamenti specifici.

• gli argomenti dei metodi hanno parametri del tipo XxxEvent

– I metodi in MouseEvent sono di particolare interesse