This shows you the differences between two versions of the page.
| 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()''). | ||