【问题标题】:See when a mousebutton is clicked without adding mouselisteners to all components查看何时单击鼠标按钮而不向所有组件添加鼠标侦听器
【发布时间】:2012-07-16 10:38:31
【问题描述】:

我有一个 JFrame,其中包含许多具有不同功能的子组件和子面板。我已经为其中一些添加了 mouseListeners。

我希望能够在框架中单击鼠标按钮时调用一个函数,而不管焦点所在的组件是什么。我不想将鼠标侦听器添加到所有组件。很像 keyEventDispacher,我将它用于键盘。

我看过这个Dispatch MouseEvent,但我无法解决。谁能给我一个小例子来演示它是如何工作的?

【问题讨论】:

  • 即使单击交互式组件(例如JButton)也要调用它吗?

标签: java swing jframe mouseevent mouselistener


【解决方案1】:

这里是一个全局鼠标监听的简单例子:

public static void main ( String[] args )
{
    final JFrame frame = new JFrame ();

    // Some content
    frame.getContentPane ().setLayout ( new FlowLayout ( FlowLayout.CENTER, 5, 5 ) );
    frame.getContentPane ().add ( new JButton ( "Test" ) );
    frame.getContentPane ().add ( new JLabel ( "Test" ) );
    frame.getContentPane ().add ( new JTextField ( "Test" ) );

    // Global mouse listener
    final AWTEventListener listener = new AWTEventListener ()
    {
        public void eventDispatched ( AWTEvent event )
        {
            // Event and component that recieved that event
            MouseEvent me = ( MouseEvent ) event;
            Component c = me.getComponent ();

            // Ignoring mouse events from any other frame
            if ( SwingUtilities.getWindowAncestor ( c ) == frame )
            {
                if ( event.getID () == MouseEvent.MOUSE_PRESSED )
                {
                    System.out.println ( "Mouse pressed on " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_RELEASED )
                {
                    System.out.println ( "Mouse released on " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_ENTERED )
                {
                    System.out.println ( "Mouse entered " + c.getClass ().getCanonicalName () );
                }
                if ( event.getID () == MouseEvent.MOUSE_EXITED )
                {
                    System.out.println ( "Mouse exited " + c.getClass ().getCanonicalName () );
                }
            }
        }
    };
    Toolkit.getDefaultToolkit ().addAWTEventListener ( listener, AWTEvent.MOUSE_EVENT_MASK );

    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

请注意,此侦听器会通知您任何框架/对话框/窗口/弹出窗口中的每个鼠标事件。这就是为什么您应该像我在示例中所做的那样将您的操作限制在某个特定的框架内,以防您不需要来自其他框架/窗口/...的事件。

顺便说一句,您可以使用相同的方法轻松地在全局范围内监听一些其他事件(例如关键事件)。例如 - 使用 AWTEvent.KEY_EVENT_MASK 键而不是 AWTEvent.MOUSE_EVENT_MASK 并将 AWTEvent 转换为 KeyEvent 而不是 MouseEvent。

【讨论】:

    【解决方案2】:

    在最好的时候,这将是一个混乱和痛苦的世界......

    在此处查看Global Event Listeners with AWTEventListener & how to pull MouseEvent's from it 以了解替代概念。基本上它是一个全局鼠标监听器。你需要做很多工作才能让它为你工作(检查孩子是否属于父母等),但它确实工作得很好。

    【讨论】:

      【解决方案3】:

      尝试使用MouseEvent Class,使用静态方法MOUSE_CLICKED

      更多详情请参见此处:

      http://docs.oracle.com/javase/6/docs/api/java/awt/event/MouseEvent.html

      请参阅来自 roseindia 的此示例

      import java.awt.*;
      import java.awt.event.*;
      
      public class MouseClick {
        Label lbl;
        public static void main(String[] args) {
        MouseClick MC = new MouseClick();
        }
      
        public MouseClick(){
        Frame f = new Frame("Checking the mouse click");
        Panel p = new Panel();
        Button button = new Button("Click Me");
        button.addMouseListener(new MyMouseListener());
        p.add(button, BorderLayout.NORTH);
        f.add(p,BorderLayout.NORTH);
        lbl = new Label("Roseindia.net");
        f.add(lbl, BorderLayout.CENTER);
        f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent we){
        System.exit(0);
        }
        });
        f.setSize(400,400);
        f.setVisible(true);
        }
      
        public class MyMouseListener extends MouseAdapter{
        public void mouseClicked(MouseEvent me){
        String str = lbl.getText();
        if (str.equals("Roseindia.net")){
        lbl.setText("You have clicke the button.");
        }
        else if (str.equals("You have clicke the button.")){
        lbl.setText("Roseindia.net");
        }
        }
        }
      }
      

      查看这个来自 Oracle 的示例

       public class MouseEventDemo ... implements MouseListener {
                  //where initialization occurs:
                  //Register for mouse events on blankArea and the panel.
                  blankArea.addMouseListener(this);
                  addMouseListener(this);
              ...
      
              public void mousePressed(MouseEvent e) {
                 saySomething("Mouse pressed; # of clicks: "
                              + e.getClickCount(), e);
              }
      
              public void mouseReleased(MouseEvent e) {
                 saySomething("Mouse released; # of clicks: "
                              + e.getClickCount(), e);
              }
      
              public void mouseEntered(MouseEvent e) {
                 saySomething("Mouse entered", e);
              }
      
              public void mouseExited(MouseEvent e) {
                 saySomething("Mouse exited", e);
              }
      
              public void mouseClicked(MouseEvent e) {
                 saySomething("Mouse clicked (# of clicks: "
                              + e.getClickCount() + ")", e);
              }
      
              void saySomething(String eventDescription, MouseEvent e) {
                  textArea.append(eventDescription + " detected on "
                                  + e.getComponent().getClass().getName()
                                  + "." + newline);
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2013-06-14
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        相关资源
        最近更新 更多