java - 在不向所有组件添加鼠标监听器的情况下查看何时单击鼠标按钮

标签 java swing jframe mouseevent mouselistener

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

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

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

最佳答案

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

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。

关于java - 在不向所有组件添加鼠标监听器的情况下查看何时单击鼠标按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11502619/

相关文章:

java - 如何通过方法返回一个新号码

用于 SplitPane 分隔符的 Java 金属外观和感觉 UIManager 画家

java - 无法在 Java swing 面板中的文本字段下方获取 bordertitle?

java - 在 JFrame 中分层多个组件

java - JLabel.setText ("__") 在 for 循环中不会打印多次

java - 我需要获取字数、字符数和行数 :

java - 在 Linux (CentOS 5.4) 中运行 jNotify 时出现问题

java - 将 javah -jni 与 Eclipse 项目结构一起使用

java - 如何在 Swing 中制作此 GUI 布局

java - JFrame 的尺寸不正确