swing:mouse_events

Differences

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

Link to this comparison view

Next revision
Previous revision
swing:mouse_events [2015/05/16 22:01]
gthanos created
swing:mouse_events [2016/02/26 11:15] (current)
Line 3: Line 3:
 Κάθε φορά που μετακινείτε το ποντίκι ή πατάτε κάποιο κουμπί στο ποντίκι σας δημιουργείτε ένα //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//​. Κάθε φορά που μετακινείτε το ποντίκι ή πατάτε κάποιο κουμπί στο ποντίκι σας δημιουργείτε ένα //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//​ αφορά την κίνηση του ποντικού. Ας δούμε αναλυτικότερα ποιες μεθόδους περιλαμβάνει το interface //​MouseListener//​.+Για να λάβετε ένα 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> <code java>
Line 18: Line 23:
 </​code>​ </​code>​
  
-Αντιστοίχωςοι μέθοδοι που πρέπει να υποστηρίζει κάθε αντικείμενο που υλοποιεί το interface //​MouseMotionListener//​ είναι οι παρακάτω.+Παρακάτω δίνεται ένα παράδειγμα από το 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> <code java>
 void mouseDragged(MouseEvent e) void mouseDragged(MouseEvent e)
Line 24: Line 160:
 void mouseMoved(MouseEvent e) void mouseMoved(MouseEvent e)
 //Invoked when the mouse cursor has been moved onto a component but no buttons have been pushed. //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>​ </​code>​
  
 +Από το παραπάνω παράδειγμα μπορείτε να δείτε ​
 +  - Πως μπορείτε να πάρετε την θέση του ποντικιού μετά από κάθε //event// (''​e.getX()''​ και ''​e.getY()''​).
 +  - Πως μπορείτε να δείτε με ποιο Swing component συνδέεται το συγκεκριμένο //event// (''​e.getComponent().getClass().getName()''​).
swing/mouse_events.1431813704.txt.gz · Last modified: 2016/02/26 11:15 (external edit)