Java Tutorial/Swing Event/Mouse Event

Материал из Java эксперт
Перейти к: навигация, поиск

Detecting Double and Triple Clicks

   <source lang="java">

import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {

 public static void main(String[] argv) throws Exception {
   JTextField component = new JTextField();
   component.addMouseListener(new MyMouseListener());
   JFrame f = new JFrame();
   f.add(component);
   f.setSize(300, 300);
   f.setVisible(true);
   component.addMouseListener(new MyMouseListener());
 }

} class MyMouseListener extends MouseAdapter {

 public void mouseClicked(MouseEvent evt) {
   if (evt.getClickCount() == 3) {
     System.out.println("triple-click");
   } else if (evt.getClickCount() == 2) {
     System.out.println("double-click");
   }
 }

}</source>





Handling Mouse Clicks

   <source lang="java">

import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {

 public static void main(String[] argv) throws Exception {
   JTextField component = new JTextField();
   component.addMouseListener(new MyMouseListener());
   JFrame f = new JFrame();
   f.add(component);
   f.setSize(300, 300);
   f.setVisible(true);
 }

} class MyMouseListener extends MouseAdapter {

 public void mouseClicked(MouseEvent evt) {
   if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
     System.out.println("left" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
     System.out.println("middle" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
     System.out.println("right" + (evt.getPoint()));
   }
 }

}</source>





InputEvent.BUTTON1_MASK (for left mouse button)

   <source lang="java">

import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {

 public static void main(String[] argv) throws Exception {
   JTextField component = new JTextField();
   component.addMouseListener(new MyMouseListener());
   JFrame f = new JFrame();
   f.add(component);
   f.setSize(300, 300);
   f.setVisible(true);
 }

} class MyMouseListener extends MouseAdapter {

 public void mouseClicked(MouseEvent evt) {
   if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
     System.out.println("left" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
     System.out.println("middle" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
     System.out.println("right" + (evt.getPoint()));
   }
 }

}</source>





InputEvent.BUTTON2_MASK (for middle mouse button)

   <source lang="java">

import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {

 public static void main(String[] argv) throws Exception {
   JTextField component = new JTextField();
   component.addMouseListener(new MyMouseListener());
   JFrame f = new JFrame();
   f.add(component);
   f.setSize(300, 300);
   f.setVisible(true);
 }

} class MyMouseListener extends MouseAdapter {

 public void mouseClicked(MouseEvent evt) {
   if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
     System.out.println("left" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
     System.out.println("middle" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
     System.out.println("right" + (evt.getPoint()));
   }
 }

}</source>





InputEvent.BUTTON3_MASK (for right mouse button)

   <source lang="java">

import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTextField; public class Main {

 public static void main(String[] argv) throws Exception {
   JTextField component = new JTextField();
   component.addMouseListener(new MyMouseListener());
   JFrame f = new JFrame();
   f.add(component);
   f.setSize(300, 300);
   f.setVisible(true);
 }

} class MyMouseListener extends MouseAdapter {

 public void mouseClicked(MouseEvent evt) {
   if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
     System.out.println("left" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
     System.out.println("middle" + (evt.getPoint()));
   }
   if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) {
     System.out.println("right" + (evt.getPoint()));
   }
 }

}</source>





Mouse event popup menu triggered

   <source lang="java">

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; public class Test extends JFrame {

 JPopupMenu menu = new JPopupMenu("Popup");
 class MyLabel extends JLabel {
   public MyLabel(String text) {
     super(text);
     addMouseListener(new PopupTriggerListener());
   }
   class PopupTriggerListener extends MouseAdapter {
     public void mousePressed(MouseEvent ev) {
       if (ev.isPopupTrigger()) {
         menu.show(ev.getComponent(), ev.getX(), ev.getY());
       }
     }
     public void mouseReleased(MouseEvent ev) {
       if (ev.isPopupTrigger()) {
         menu.show(ev.getComponent(), ev.getX(), ev.getY());
       }
     }
     public void mouseClicked(MouseEvent ev) {
     }
   }
 }
 JLabel label = new MyLabel("right-click");
 public Test() {
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuItem item = new JMenuItem("Test1");
   item.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       System.out.println("Menu item Test1");
     }
   });
   menu.add(item);
   item = new JMenuItem("Test2");
   item.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       System.out.println("Menu item Test2");
     }
   });
   menu.add(item);
   getContentPane().add(label);
   pack();
   setSize(300, 100);
 }
 public static void main(String[] args) {
   new Test().setVisible(true);
 }

}</source>





Right click to trigger the popup menu

   <source lang="java">

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; public class Test extends JFrame {

 JPopupMenu menu = new JPopupMenu("Popup");
 class MyLabel extends JLabel {
   public MyLabel(String text) {
     super(text);
     addMouseListener(new PopupTriggerListener());
   }
   class PopupTriggerListener extends MouseAdapter {
     public void mousePressed(MouseEvent ev) {
       if (ev.isPopupTrigger()) {
         menu.show(ev.getComponent(), ev.getX(), ev.getY());
       }
     }
     public void mouseReleased(MouseEvent ev) {
       if (ev.isPopupTrigger()) {
         menu.show(ev.getComponent(), ev.getX(), ev.getY());
       }
     }
     public void mouseClicked(MouseEvent ev) {
     }
   }
 }
 JLabel label = new MyLabel("right-click");
 public Test() {
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JMenuItem item = new JMenuItem("Test1");
   item.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       System.out.println("Menu item Test1");
     }
   });
   menu.add(item);
   item = new JMenuItem("Test2");
   item.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
       System.out.println("Menu item Test2");
     }
   });
   menu.add(item);
   getContentPane().add(label);
   pack();
   setSize(300, 100);
 }
 public static void main(String[] args) {
   new Test().setVisible(true);
 }

}</source>





Uses a subclass of MouseInputAdapter to listen to mouse events and mouse-motion events

Uses a subclass of MouseInputAdapter to listen to mouse events and mouse-motion events on the root pane"s glass pane. Redispatches the events to underlying components.



   <source lang="java">

/*

*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/

import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import javax.swing.AbstractButton; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; /** A 1.4 application that requires no other files. */ public class GlassPaneDemo {

 static private MyGlassPane myGlassPane;
 /**
  * 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("GlassPaneDemo");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   // Start creating and adding components.
   JCheckBox changeButton = new JCheckBox("Glass pane \"visible\"");
   changeButton.setSelected(false);
   // Set up the content pane, where the "main GUI" lives.
   Container contentPane = frame.getContentPane();
   contentPane.setLayout(new FlowLayout());
   contentPane.add(changeButton);
   contentPane.add(new JButton("Button 1"));
   contentPane.add(new JButton("Button 2"));
   // Set up the menu bar, which appears above the content pane.
   JMenuBar menuBar = new JMenuBar();
   JMenu menu = new JMenu("Menu");
   menu.add(new JMenuItem("Do nothing"));
   menuBar.add(menu);
   frame.setJMenuBar(menuBar);
   // Set up the glass pane, which appears over both menu bar
   // and content pane and is an item listener on the change
   // button.
   myGlassPane = new MyGlassPane(changeButton, menuBar, frame.getContentPane());
   changeButton.addItemListener(myGlassPane);
   frame.setGlassPane(myGlassPane);
   // Show the window.
   frame.pack();
   frame.setVisible(true);
 }
 public static void main(String[] args) {
   // Schedule a job for the event-dispatching thread:
   // creating and showing this application"s GUI.
   javax.swing.SwingUtilities.invokeLater(new Runnable() {
     public void run() {
       createAndShowGUI();
     }
   });
 }

} /**

* We have to provide our own glass pane so that it can paint.
*/

class MyGlassPane extends JComponent implements ItemListener {

 Point point;
 // React to change button clicks.
 public void itemStateChanged(ItemEvent e) {
   setVisible(e.getStateChange() == ItemEvent.SELECTED);
 }
 protected void paintComponent(Graphics g) {
   if (point != null) {
     g.setColor(Color.red);
     g.fillOval(point.x - 10, point.y - 10, 20, 20);
   }
 }
 public void setPoint(Point p) {
   point = p;
 }
 public MyGlassPane(AbstractButton aButton, JMenuBar menuBar, Container contentPane) {
   CBListener listener = new CBListener(aButton, menuBar, this, contentPane);
   addMouseListener(listener);
   addMouseMotionListener(listener);
 }

} /**

* Listen for all events that our check box is likely to be interested in.
* Redispatch them to the check box.
*/

class CBListener extends MouseInputAdapter {

 Toolkit toolkit;
 Component liveButton;
 JMenuBar menuBar;
 MyGlassPane glassPane;
 Container contentPane;
 public CBListener(Component liveButton, JMenuBar menuBar, MyGlassPane glassPane,
     Container contentPane) {
   toolkit = Toolkit.getDefaultToolkit();
   this.liveButton = liveButton;
   this.menuBar = menuBar;
   this.glassPane = glassPane;
   this.contentPane = contentPane;
 }
 public void mouseMoved(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mouseDragged(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mouseClicked(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mouseEntered(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mouseExited(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mousePressed(MouseEvent e) {
   redispatchMouseEvent(e, false);
 }
 public void mouseReleased(MouseEvent e) {
   redispatchMouseEvent(e, true);
 }
 // A more finished version of this method would
 // handle mouse-dragged events specially.
 private void redispatchMouseEvent(MouseEvent e, boolean repaint) {
   Point glassPanePoint = e.getPoint();
   Container container = contentPane;
   Point containerPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, contentPane);
   if (containerPoint.y < 0) { // we"re not in the content pane
     if (containerPoint.y + menuBar.getHeight() >= 0) {
       // The mouse event is over the menu bar.
       // Could handle specially.
     } else {
       // The mouse event is over non-system window
       // decorations, such as the ones provided by
       // the Java look and feel.
       // Could handle specially.
     }
   } else {
     // The mouse event is probably over the content pane.
     // Find out exactly which component it"s over.
     Component component = SwingUtilities.getDeepestComponentAt(container, containerPoint.x,
         containerPoint.y);
     if ((component != null) && (component.equals(liveButton))) {
       // Forward events over the check box.
       Point componentPoint = SwingUtilities.convertPoint(glassPane, glassPanePoint, component);
       component.dispatchEvent(new MouseEvent(component, e.getID(), e.getWhen(), e.getModifiers(),
           componentPoint.x, componentPoint.y, e.getClickCount(), e.isPopupTrigger()));
     }
   }
   // Update the glass pane if requested.
   if (repaint) {
     glassPane.setPoint(glassPanePoint);
     glassPane.repaint();
   }
 }

}</source>





Using SwingUtilities for Mouse Button Identification

   <source lang="java">

SwingUtilities.isLeftMouseButton(MouseEvent mouseEvent)

   SwingUtilities.isMiddleMouseButton(MouseEvent mouseEvent)
   SwingUtilities.isRightMouseButton(MouseEvent mouseEvent)</source>