swing:mouse_events

Mouse Events & Mouse Listeners

Κάθε φορά που μετακινείτε το ποντίκι ή πατάτε κάποιο κουμπί στο ποντίκι σας δημιουργείτε ένα event του τύπου MouseEvent. Αντίστοιχα, εάν μετακινείτε την ροδέλα του ποντικιού σας, τότε παράγεται ένα event του τύπου MouseWheelEvent. Σε αυτή την ενότητα θα ασχοληθούμε αποκλειστικά με MouseEvents.

Για να λάβετε ένα MouseEvent θα πρέπει να ορίσετε για τα Components που θέλετε να ακούν τα συγκεκριμένα events ένα αντικείμενο του τύπου MouseListener ή MouseMotionListener ως Listener. Ο πρώτος τύπος Listener αφορά τα events που συνδέονται με τα πλήκτρα του ποντικιού, ενώ ο δεύτερος τύπος Listener αφορά την κίνηση του ποντικού.

MouseListener Interface

Ας δούμε αναλυτικότερα ποιες μεθόδους περιλαμβάνει το interface MouseListener.

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.

Παρακάτω δίνεται ένα παράδειγμα από το site της Oracle, που δείχνει την χρήση του συγκεκριμένου Listener.

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

Από τις μεθόδους του παραπάνω interface, αλλά και από το παράδειγμα ίσως παρατηρήσατε ότι δεν μπορείτε να εξάγεται άμεσα καμία πληροφορία α) για τον αριθμό των clicks β) για το button το οποίο πατήθηκε. Την πληροφορία για τα δύο παραπάνω μπορείτε να την δείτε στην κλάση MouseEvent και συγκεκριμένα στις μεθόδους

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.

MouseMotionListener Interface

Οι μέθοδοι που πρέπει να υποστηρίζει κάθε αντικείμενο που υλοποιεί το interface MouseMotionListener είναι οι παρακάτω.

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.

Παρακάτω δίνεται ένα παράδειγμα από το site της Oracle, που δείχνει την χρήση του συγκεκριμένου Listener.

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

Από το παραπάνω παράδειγμα μπορείτε να δείτε

  1. Πως μπορείτε να πάρετε την θέση του ποντικιού μετά από κάθε event (e.getX() και e.getY()).
  2. Πως μπορείτε να δείτε με ποιο Swing component συνδέεται το συγκεκριμένο event (e.getComponent().getClass().getName()).
swing/mouse_events.txt · Last modified: 2016/02/26 11:15 (external edit)