This shows you the differences between two versions of the page.
Next revision | Previous revision Next revision Both sides next revision | ||
swing:mouse_events [2015/05/16 22:01] gthanos created |
swing:mouse_events [2015/05/16 22:33] gthanos [MouseMotionListener Interface] |
||
---|---|---|---|
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()''). |