User Tools

Site Tools


swing:mouse_events

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Previous revision
swing:mouse_events [2015/05/16 21:33]
swing:mouse_events [2015/05/16 22:33]
gthanos [MouseMotionListener Interface]
Line 1: Line 1:
 +====== Mouse Events & Mouse Listeners ======
  
 +Κάθε φορά που μετακινείτε το ποντίκι ή πατάτε κάποιο κουμπί στο ποντίκι σας δημιουργείτε ένα //event// του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html|MouseEvent]]. Αντίστοιχα, εάν μετακινείτε την ροδέλα του ποντικιού σας, τότε παράγεται ένα //event// του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseWheelEvent.html|MouseWheelEvent]]. Σε αυτή την ενότητα θα ασχοληθούμε αποκλειστικά με //MouseEvents//.
 +
 +Για να λάβετε ένα MouseEvent θα πρέπει να ορίσετε για τα //Components// που θέλετε να ακούν τα συγκεκριμένα //events// ένα αντικείμενο του τύπου [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseListener.html|MouseListener]] ή [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseMotionListener.html|MouseMotionListener]] ως //Listener//. Ο πρώτος τύπος //Listener// αφορά τα events που συνδέονται με τα πλήκτρα του ποντικιού, ενώ ο δεύτερος τύπος //Listener// αφορά την κίνηση του ποντικού. 
 +
 +===== MouseListener Interface =====
 +
 +
 +Ας δούμε αναλυτικότερα ποιες μεθόδους περιλαμβάνει το interface //MouseListener//.
 +
 +<code java>
 +void  mouseClicked(MouseEvent e)
 +//Invoked when the mouse button has been clicked (pressed and released) on a component.
 +void  mouseEntered(MouseEvent e)
 +//Invoked when the mouse enters a component.
 +void  mouseExited(MouseEvent e)
 +//Invoked when the mouse exits a component.
 +void  mousePressed(MouseEvent e)
 +//Invoked when a mouse button has been pressed on a component.
 +void  mouseReleased(MouseEvent e)
 +//Invoked when a mouse button has been released on a component.
 +</code>
 +
 +Παρακάτω δίνεται ένα παράδειγμα από το site της Oracle, που δείχνει την χρήση του συγκεκριμένου Listener.
 +
 +<code java MouseEventDemo.java>
 +
 +package events;
 +
 +/*
 +* MouseEventDemo.java
 +*/
 +
 +import java.awt.GridLayout;
 +import java.awt.Color;
 +import java.awt.Dimension;
 +import java.awt.event.MouseListener;
 +import java.awt.event.MouseEvent;
 +
 +import javax.swing.*;
 +
 +public class MouseEventDemo extends JPanel
 +    implements MouseListener {
 +  BlankArea blankArea;
 +  JTextArea textArea;
 +  static final String NEWLINE = System.getProperty("line.separator");
 +  
 +  public static void main(String[] args) {
 +    /* Use an appropriate Look and Feel */
 +    try {
 +      //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
 +      //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
 +      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
 +    } catch (UnsupportedLookAndFeelException ex) {
 +      ex.printStackTrace();
 +    } catch (IllegalAccessException ex) {
 +      ex.printStackTrace();
 +    } catch (InstantiationException ex) {
 +      ex.printStackTrace();
 +    } catch (ClassNotFoundException ex) {
 +      ex.printStackTrace();
 +    }
 +    /* Turn off metal's use of bold fonts */
 +    UIManager.put("swing.boldMetal", Boolean.FALSE);
 +    //Schedule a job for the event dispatch thread:
 +    //creating and showing this application's GUI.
 +    javax.swing.SwingUtilities.invokeLater(new Runnable() {
 +      public void run() {
 +        createAndShowGUI();
 +      }
 +    });
 +  }
 +  
 +  /**
 +   * Create the GUI and show it.  For thread safety,
 +   * this method should be invoked from the
 +   * event dispatch thread.
 +   */
 +  private static void createAndShowGUI() {
 +    //Create and set up the window.
 +    JFrame frame = new JFrame("MouseEventDemo");
 +    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +    
 +    //Create and set up the content pane.
 +    JComponent newContentPane = new MouseEventDemo();
 +    newContentPane.setOpaque(true); //content panes must be opaque
 +    frame.setContentPane(newContentPane);
 +    
 +    //Display the window.
 +    frame.pack();
 +    frame.setVisible(true);
 +  }
 +  
 +  public MouseEventDemo() {
 +    super(new GridLayout(0,1));
 +    blankArea = new BlankArea(Color.YELLOW);
 +    add(blankArea);
 +    textArea = new JTextArea();
 +    textArea.setEditable(false);
 +    JScrollPane scrollPane = new JScrollPane(textArea);
 +    scrollPane.setVerticalScrollBarPolicy(
 +        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
 +    scrollPane.setPreferredSize(new Dimension(200, 75));
 +    add(scrollPane);
 +    
 +    //Register for mouse events on blankArea and the panel.
 +    blankArea.addMouseListener(this);
 +    addMouseListener(this);
 +    setPreferredSize(new Dimension(450, 450));
 +    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
 +  }
 +  
 +  void eventOutput(String eventDescription, MouseEvent e) {
 +    textArea.append(eventDescription + " detected on "
 +        + e.getComponent().getClass().getName()
 +        + "." + NEWLINE);
 +    textArea.setCaretPosition(textArea.getDocument().getLength());
 +  }
 +  
 +  public void mousePressed(MouseEvent e) {
 +    eventOutput("Mouse pressed (# of clicks: "
 +        + e.getClickCount() + ")", e);
 +  }
 +  
 +  public void mouseReleased(MouseEvent e) {
 +    eventOutput("Mouse released (# of clicks: "
 +        + e.getClickCount() + ")", e);
 +  }
 +  
 +  public void mouseEntered(MouseEvent e) {
 +    eventOutput("Mouse entered", e);
 +  }
 +  
 +  public void mouseExited(MouseEvent e) {
 +    eventOutput("Mouse exited", e);
 +  }
 +  
 +  public void mouseClicked(MouseEvent e) {
 +    eventOutput("Mouse clicked (# of clicks: "
 +        + e.getClickCount() + ")", e);
 +  }
 +}
 +</code>
 +
 +Από τις μεθόδους του παραπάνω interface, αλλά και από το παράδειγμα ίσως παρατηρήσατε ότι δεν μπορείτε να εξάγεται άμεσα καμία πληροφορία **α)** για τον αριθμό των clicks **β)** για το button το οποίο πατήθηκε. Την πληροφορία για τα δύο παραπάνω μπορείτε να την δείτε στην κλάση [[http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html|MouseEvent]] και συγκεκριμένα στις μεθόδους
 +<code java>
 +int getButton()
 +//Returns which, if any, of the mouse buttons has changed state.
 +int getClickCount()
 +//Returns the number of mouse clicks associated with this event.
 +</code>
 +
 +===== MouseMotionListener Interface =====
 +
 +Οι μέθοδοι που πρέπει να υποστηρίζει κάθε αντικείμενο που υλοποιεί το interface //MouseMotionListener// είναι οι παρακάτω.
 +<code java>
 +void mouseDragged(MouseEvent e)
 +//Invoked when a mouse button is pressed on a component and then dragged.
 +void mouseMoved(MouseEvent e)
 +//Invoked when the mouse cursor has been moved onto a component but no buttons have been pushed.
 +</code>
 +Παρακάτω δίνεται ένα παράδειγμα από το site της Oracle, που δείχνει την χρήση του συγκεκριμένου Listener.
 +<code java MouseMotionEventDemo.java>
 +package events;
 +
 +/*
 + * MouseMotionEventDemo.java
 + *
 + */
 +
 +import java.awt.Color;
 +import java.awt.Dimension;
 +import java.awt.event.MouseMotionListener;
 +import java.awt.event.MouseEvent;
 +import java.awt.GridLayout;
 +
 +import javax.swing.*;
 +
 +public class MouseMotionEventDemo extends JPanel
 +    implements MouseMotionListener {
 +  BlankArea blankArea;
 +  JTextArea textArea;
 +  static final String NEWLINE = System.getProperty("line.separator");
 +  
 +  public static void main(String[] args) {
 +    /* Use an appropriate Look and Feel */
 +    try {
 +      //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
 +      //UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
 +      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
 +    } catch (UnsupportedLookAndFeelException ex) {
 +      ex.printStackTrace();
 +    } catch (IllegalAccessException ex) {
 +      ex.printStackTrace();
 +    } catch (InstantiationException ex) {
 +
 +      ex.printStackTrace();
 +    } catch (ClassNotFoundException ex) {
 +      ex.printStackTrace();
 +    }
 +    /* Turn off metal's use of bold fonts */
 +    UIManager.put("swing.boldMetal", Boolean.FALSE);
 +    
 +    //Schedule a job for the event dispatch thread:
 +    //creating and showing this application's GUI.
 +    javax.swing.SwingUtilities.invokeLater(new Runnable() {
 +      public void run() {
 +        createAndShowGUI();
 +      }
 +    });
 +  }
 +  
 +  /**
 +   * Create the GUI and show it.  For thread safety,
 +   * this method should be invoked from the
 +   * event-dispatching thread.
 +   */
 +  private static void createAndShowGUI() {
 +    //Create and set up the window.
 +    JFrame frame = new JFrame("MouseMotionEventDemo");
 +    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +    
 +    //Create and set up the content pane.
 +    JComponent newContentPane = new MouseMotionEventDemo();
 +    newContentPane.setOpaque(true); //content panes must be opaque
 +    frame.setContentPane(newContentPane);
 +    
 +    //Display the window.
 +    frame.pack();
 +    frame.setVisible(true);
 +  }
 +  
 +  public MouseMotionEventDemo() {
 +    super(new GridLayout(0,1));
 +    blankArea = new BlankArea(Color.YELLOW);
 +    add(blankArea);
 +    
 +    textArea = new JTextArea();
 +    textArea.setEditable(false);
 +    JScrollPane scrollPane = new JScrollPane(textArea,
 +        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
 +        JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 +    scrollPane.setPreferredSize(new Dimension(200, 75));
 +    
 +    add(scrollPane);
 +    
 +    //Register for mouse events on blankArea and panel.
 +    blankArea.addMouseMotionListener(this);
 +    addMouseMotionListener(this);
 +    
 +    setPreferredSize(new Dimension(450, 450));
 +    setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
 +  }
 +  
 +  void eventOutput(String eventDescription, MouseEvent e) {
 +    textArea.append(eventDescription
 +        + " (" + e.getX() + "," + e.getY() + ")"
 +        + " detected on "
 +        + e.getComponent().getClass().getName()
 +        + NEWLINE);
 +    textArea.setCaretPosition(textArea.getDocument().getLength());
 +  }
 +  
 +  public void mouseMoved(MouseEvent e) {
 +    eventOutput("Mouse moved", e);
 +  }
 +  
 +  public void mouseDragged(MouseEvent e) {
 +    eventOutput("Mouse dragged", e);
 +  }
 +}
 +</code>
 +
 +Από το παραπάνω παράδειγμα μπορείτε να δείτε 
 +  - Πως μπορείτε να πάρετε την θέση του ποντικιού μετά από κάθε //event// (''e.getX()'' και ''e.getY()'').
 +  - Πως μπορείτε να δείτε με ποιο Swing component συνδέεται το συγκεκριμένο //event// (''e.getComponent().getClass().getName()'').
swing/mouse_events.txt · Last modified: 2015/05/16 21:33 (external edit)