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