This shows you the differences between two versions of the page.
swing:mouse_events [2015/05/16 22:33] gthanos [MouseMotionListener Interface] |
swing:mouse_events [2016/02/26 11:15] |
||
---|---|---|---|
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> | ||
- | |||
- | Από το παραπάνω παράδειγμα μπορείτε να δείτε | ||
- | - Πως μπορείτε να πάρετε την θέση του ποντικιού μετά από κάθε //event// (''e.getX()'' και ''e.getY()''. | ||
- | - Πως μπορείτε να δείτε με ποιο Swing component συνδέεται το συγκεκριμένο //event// (''e.getComponent().getClass().getName()''). |