我已经使用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;
}
}
}
}
});