在窗口的任何位置检测鼠标单击

时间:2011-09-01 15:11:21

标签: java swing mouseevent windowlistener

我写了一个JWindow,它在我的应用程序中有点像一个奇特的菜单,在按下按钮时弹出。但是,如果用户点击主窗口中的任何位置,我希望它消失。我当然可以在主窗口中添加一个鼠标监听器,但是它不会将它添加到窗口本身的所有组件上,并且循环遍历所有组件看起来像是一个暴力解决方案(并且不能是如果窗口上的组件发生变化,保证可以正常工作。)

做这样的事情最好的方法是什么?

2 个答案:

答案 0 :(得分:5)

尝试使用Toolkit.getDefaultToolkit().addAWTEventListener(listener, eventMask)。查找仅过滤鼠标点击的eventMask。这个AWT监听器对于整个应用程序是全局的,因此您可以看到发生的所有事件。

答案 1 :(得分:3)

  

如果用户点击主窗口中的任何位置

,我希望它消失

WindowListener添加到子窗口,然后处理windowDeactiveated()事件并在子窗口上调用setVisible(false)。

工作示例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DialogDeactivated
{
    public static void main(String[] args)
    {
        final WindowListener wl = new WindowAdapter()
        {
            public void windowDeactivated(WindowEvent e)
            {
                e.getWindow().setVisible(false);
            }
        };

        JButton button = new JButton("Show Popup");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JButton button = (JButton)e.getSource();
                JFrame frame = (JFrame) SwingUtilities.windowForComponent(button);

                JDialog dialog = new JDialog(frame, false);
                dialog.setUndecorated(true);
                dialog.add( new JButton("Dummy Button") );
                dialog.pack();
                dialog.setLocationRelativeTo( frame );
                dialog.setVisible( true );
                dialog.addWindowListener( wl );
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(button, BorderLayout.NORTH);
        frame.setSize(400, 400);
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
     }
}