我有一个弹出窗口,其中向用户显示了设置。如果在它的外部单击,它将被隐藏,但如果在内部单击,它仍然可见。
处理此行为的事件处理程序获取Component
(已单击),通过递归使用component.getParent()
,我可以检查它是否是我的设置面板的子级。到目前为止,这已经奏效了。
但我只是在那个面板上添加了一个JComboBox
,结果发现点击时组合框显示的"可选择项目弹出窗口"(它有名字吗?)并不是组合框的子项。试图在组合框中选择某些内容会隐藏我的设置面板。
使用NetBeans调试器,我可以看到它的类型为BasicComboPopup$1
(那是一个匿名类吗?),但它既不是ComboPopup
、JPopupMenu
也不是BasicComboPopup
的实例。
我需要一种方法来识别被点击的"组合框弹出窗口"的所有者/父组合框。
不完全确定,但您可能正在寻找
popup.getInvoker();
其将返回调用comboBox。
下面的实用程序方法(从SwingX框架附带的SwingXUtilities复制而来):如果你找到了一个事件的源组件(方法中不幸的命名为focusOwner;-),它会检查该源是否在父组件下面,包括弹出窗口。
刚刚注意到你的父母是一个弹出窗口,所以你必须稍微调整一下逻辑,切换第一个和第二个if块(不过没有尝试-有多个可见弹出窗口是不寻常的。:-)
/**
* Returns whether the component is part of the parent's
* container hierarchy. If a parent in the chain is of type
* JPopupMenu, the parent chain of its invoker is walked.
*
* @param focusOwner
* @param parent
* @return true if the component is contained under the parent's
* hierarchy, coping with JPopupMenus.
*/
public static boolean isDescendingFrom(Component focusOwner, Component parent) {
while (focusOwner != null) {
if (focusOwner instanceof JPopupMenu) {
focusOwner = ((JPopupMenu) focusOwner).getInvoker();
if (focusOwner == null) {
return false;
}
}
if (focusOwner == parent) {
return true;
}
focusOwner = focusOwner.getParent();
}
return false;
}
-
不确定你是否在谈论
-
mouse
事件 -
keyboard
事件 -
mouse
和keyboard
事件
-
-
看看SwingUtilities,有
child
与parent
的方法,反之亦然 -
发布SSCCE,详细描述所需事件,因为有几种方法可以从
JComboBox
中提取和修改Popup
编辑
在使用AWT Popup
或将Swing lightweight
与AWT heavyweight
组件混合的情况下,必须查看Darryl 的Swing Utils