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



我已经使用Swing Popup类实现了一个弹出数字键盘。我有一个与JTEXTFIELD关联的按钮,该按钮在用户单击它时打开数字键盘,然后/如果Jtextfield丢失了焦点关闭弹出窗口。通常,它效果很好,除了我偶尔会在隐藏后从弹出窗口"剩下"的伪像。有时,工件是弹出窗口中显示的组件的图像,但更常见的是一种"黑洞",掩盖了弹出窗口所在的屏幕同一区域中显示的任何其他内容,只能通过关闭应用程序和JVM来纠正。

问题很难复制,但是当用户在弹出窗口打开时(例如通过移动或调整大小(操纵基本窗口时,它似乎表现出来。我的想法是在发生这种情况时简单地隐藏弹出窗口,我可以通过窗口列表和componentListener的组合来做。但是,我想进一步迈出一步,并在用户一旦单击窗口标题栏或框架的另一部分,甚至在他们移动,调整大小或表现出它之前,就隐藏了弹出窗口。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;
                        }
                    }
                }
            }
        });

最新更新