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
Next revision Both sides next revision
swing:mouse_events [2015/05/16 21:33]
swing:mouse_events [2015/05/16 22:30]
gthanos
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>
swing/mouse_events.txt · Last modified: 2015/05/16 21:33 (external edit)