Intercettare gli eventi di muose e tastiera in Java
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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
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
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
• 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
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()); }}
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() + ")."); }}
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
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()); }}
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); }}
9 J2EE training: http://courses.coreservlets.com
Gestire gli Eventi con un listener Separato: Caso Generale (Risultato)
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); }
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); }}
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.
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); }}
public class CircleDrawer3 extends Applet { public void init() { setForeground(Color.BLUE); addMouseListener(new CircleListener()); }
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); } }}
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); } }); }}
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
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
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()); } } ...
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); } }}
30 J2EE training: http://courses.coreservlets.com
Esempio: Semplice Lavagna
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()); }
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); } }}
33 J2EE training: http://courses.coreservlets.com
Lavagna (Results)
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