如何检测用户是否在Java中单击窗口标题栏或窗口边框的任何其他部分

我使用Swing Popup类实现了一个弹出式数字小键盘。 我有一个与JTextField关联的按钮,当用户点击它时打开数字小键盘,然后当/如果JTextField失去焦点,Popup关闭。 它通常运行良好,除了偶尔我得到隐藏后从Popup“遗留”的工件。 有时候工件是弹出窗口中显示的组件的图像,但更常见的是它是一种“黑洞”,它掩盖了弹出窗口所在屏幕的同一区域中显示的任何其他内容,通过关闭应用程序和JVM来解决问题。

这个问题难以重现,但是当用户在Popup打开时操作基本窗口时,例如通过移动或resize,似乎就会显现出来。 我的想法只是在发生类似的事情时隐藏Popup,我可以使用WindowListener和ComponentListener的组合来完成。 但是,我想更进一步,只要用户点击窗口标题栏或其框架的其他部分,即使在移动,resize或图标化之前,也会立即隐藏弹出窗口。 JComboBox弹出窗口实际上就是这样工作的。 但是,我一直无法找到任何一种机制,通过该机制我可以通知用户点击了窗口标题栏。 我已经看过JComboBox和相关的代码,但也无法弄清楚它是如何工作的。 有没有其他类型的听众可以用来获得这种通知?

我使用Swing Popup类实现了一个弹出式数字小键盘。

请发布您的代码,以便在发布问题时演示实施和问题。

我不知道你在做什么,但你可以使用JPopupMenu 。 当您单击没有FocusListener或任何其他逻辑的框架标题栏时,这将关闭。

将被删除,只是用于测试的代码,

 private boolean _myWindowFocusLost = false; 

  _xxXxx.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) {//Invoked when a component gains the keyboard focus. if (e.getOppositeComponent() != null) { if (e.getOppositeComponent() instanceof JComponent) { JComponent opposite = (JComponent) e.getOppositeComponent(); if ((opposite.getTopLevelAncestor() != _myPopupWindow) && (!_myWindowFocusLost)) { _myWindowFocusLost = false; } } } } });