Intercettare gli eventi di mouse e tastiera

of 34 /34
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 Intercettare gli eventi del Mouse e della tastiera Originals of Slides and Source Code for Examples: http://courses.coreservlets.com/Cour se-Materials/java5.html Traduzione a cura di Javastaff.com

Embed Size (px)

description

Intercettare gli eventi di muose e tastiera in Java

Transcript of Intercettare gli eventi di mouse e tastiera

  • 1. 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. 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. 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 unistanza del vostro listener nella window
    • w.add Xxx Listener(new MyListenerClass());
      • Es: addKeyListener, addMouseListener

4. 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. Listener Separato: Caso Semplice (Continua)

  • import java.awt.event.*;
  • public class ClickListenerextends MouseAdapter{
  • public void mousePressed(MouseEvent event) {
  • System.out.println("Mouse pressed at (" +
  • event.getX() + "," +
  • event.getY() + ").");
  • }
  • }

6. 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 levento
    • Eseguire un cast sul risultato ottenendo il tipo di interesse
    • Invocare i metodi di questo oggetto

7. Gestire gli Eventi con un listener Separato: Caso Generale

  • import java.applet.Applet;
  • import java.awt.*;
  • public class CircleDrawer1 extends Applet {
  • public void init() {
  • setForeground(Color.BLUE);
  • addMouseListener(new CircleListener());
  • }
  • }

8. 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. Gestire gli Eventi con un listener Separato: Caso Generale (Risultato) 10. Caso 2: Implementare uniterfaccia Listener

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

11. Implementare uniterfaccia Listener (Continua)

  • public voidmouseEntered (MouseEvent event) {}
  • public voidmouseExited (MouseEvent event) {}
  • public voidmouseReleased (MouseEvent event) {}
  • public voidmouseClicked (MouseEvent event) {}
  • public void mousePressed(MouseEvent event) {
  • Graphics g = getGraphics();
  • g.fillOval(event.getX()-radius,
  • event.getY()-radius,
  • 2*radius,
  • 2*radius);
  • }
  • }

12. Adapters vs. Interfacce:Errori di Signature dei metodi

  • Cosa succede se si sbaglia la signature del metodo?
    • public void mouse p ressed(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 chepensatedi stare eseguendo un override di un metodo, scrivete "@Override" sulla linea precedente linizio di tale metodo.
      • Se il metodo non sta effettivamente eseguendo loverride, otterrete un errore di compilazione.

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

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

15. 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. 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. 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 linterfaccia
    • Vantaggi
      • Nessun passo extra per invocare metodi nella finestra principale
    • Svantaggi
      • Bisogna implementare tutti i metodi, anche quelli non utili

18. 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

19. Listener di Eventi Standard AWT (Sommario) 20. 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/lhide degli oggetti GUI
      • componentResized(ComponentEvent event)
      • componentMoved (ComponentEvent event)
      • componentShown(ComponentEvent event)
      • componentHidden(ComponentEvent event)

21. 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)

22. 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

23. 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 chiamaresiaaddMouseListener che addMouseMotionListener, quindi non si risparmia molto in tempo

24. 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

25. 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..

26. Esempio semplice: Spelling-Correcting Textfield

  • KeyListener corregge lo spelling durante la scrittura
  • ActionListener completa le parole alla pressione diENTER
  • FocusListener fornisce suggerimenti

27. 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;
  • }

28. Esempio: Semplice Lavagna

  • private class PositionRecorderextends MouseAdapter{
  • public voidmouseEntered (MouseEvent event) {
  • requestFocus(); // Plan ahead for typing
  • record(event.getX(), event.getY());
  • }
  • public voidmousePressed (MouseEvent event) {
  • record(event.getX(), event.getY());
  • }
  • }
  • ...

29. Esempio: Semplice Lavagna

  • ...
  • private class LineDrawerextends MouseMotionAdapter{
  • public voidmouseDragged (MouseEvent event) {
  • int x = event.getX();
  • int y = event.getY();
  • Graphics g = getGraphics();
  • g.drawLine(lastX, lastY, x, y);
  • record(x, y);
  • }
  • }
  • }

30. Esempio: Semplice Lavagna 31. Lavagna: Aggiungere gli eventi della tastiera

  • import java.applet.Applet;
  • import java.awt.*;
  • import java.awt.event.*;
  • public class Whiteboardextends 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. Lavagna (Continua)

  • ...
  • private class CharDrawerextends KeyAdapter{
  • // When user types a printable character,
  • // draw it and shift position rightwards.
  • public voidkeyTyped (KeyEvent event) {
  • String s = String.valueOf(event.getKeyChar());
  • getGraphics().drawString(s, lastX, lastY);
  • record(lastX + fm.stringWidth(s), lastY);
  • }
  • }
  • }

33. Lavagna (Results) 34. 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 unistanza della vostra classe listener nella window
      • Invocare add Xxx Listener
  • 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