• Like
Intercettare gli eventi di mouse e tastiera
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Intercettare gli eventi di mouse e tastiera

  • 6,784 views
Published

Intercettare gli eventi di muose e tastiera in Java

Intercettare gli eventi di muose e tastiera in Java

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
6,784
On SlideShare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
74
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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 un’istanza 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 ClickListener extends 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 l’evento
      • 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 un’iterfaccia 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 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. 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 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. 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 l’interfaccia
      • 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/l’hide 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 chiamare sia addMouseListener 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 di ENTER
    • 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 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. 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. Esempio: Semplice Lavagna
  • 31. Lavagna: Aggiungere gli eventi della tastiera
    • 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());
    • }
  • 32. 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. 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 un’istanza 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