如何检测用户是否在Java

时间:2017-05-05 17:13:13

标签: java swing

我使用Swing Popup类实现了一个弹出式数字小键盘。我有一个与JTextField相关联的按钮,当用户点击它时打开数字小键盘,然后当/如果JTextField失去焦点,Popup关闭。它通常很有效,除了偶尔我得到的东西是#34;遗留下来的#34;隐藏后从弹出窗口。有时,工件是弹出窗口中显示的组件的图像,但更常见的是它是一个黑洞"可以通过关闭应用程序和JVM来解决显示在Popup所在屏幕的同一区域中显示的任何其他内容的类别。

问题难以重现,但似乎在用户在弹出窗口打开时操作基本窗口时会出现,例如移动或调整大小。我的想法只是在发生类似的事情时隐藏弹出窗口,我可以使用WindowListener和ComponentListener的组合来做。但是,我想更进一步,只要用户点击窗口标题栏或其框架的其他部分,即使在移动,调整大小或图标化之前,也会立即隐藏弹出窗口。 JComboBox弹出窗口实际上就是这样工作的。但是,我一直无法找到任何机制,通过该机制我可以通知用户点击了窗口标题栏。我已经查看了JComboBox及相关代码,并且无法从中了解它是如何运用这种魔力的。是否有其他类型的倾听者可以用来获得这种通知?

2 个答案:

答案 0 :(得分:2)

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

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;
                        }
                    }
                }
            }
        });

答案 1 :(得分:2)

  

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

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

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