Intercettare gli eventi di mouse e tastiera
-
Author
federicopaparoni -
Category
Technology
-
view
6.797 -
download
8
Embed Size (px)
description
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
-
-