我有一个向用户显示设置的弹出窗口。如果你点击它外面,它隐藏但如果你点击里面它仍然可见。
处理此行为的事件处理程序获取Component
(已单击)并通过递归使用component.getParent()
我可以检查它是否是我的设置面板的子项。到目前为止,这已经奏效了。
但是我刚刚向该面板添加了一个JComboBox
,结果是“可选项弹出”(它有一个名字?)组合框在点击时显示的不是组合框的子项。尝试在组合框中选择某些内容会隐藏我的设置面板。
使用NetBeans调试器我可以看到它的类型BasicComboPopup$1
(这是一个匿名类吗?),但它不是ComboPopup
,JPopupMenu
和{的实例。 {1}}。
我需要一种方法来识别被点击的“组合框弹出窗口”的所有者/父组合框。
答案 0 :(得分:5)
不完全确定,但您可能正在寻找
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;
}
答案 1 :(得分:1)
不确定你是否在谈论
mouse
活动
keyboard
活动
mouse
和keyboard
事件
查看SwingUtilities child
v.s.的方法parent
,反之亦然
发布SSCCE,其中包含有关所需事件的详细说明,因为有一些方法可以从Popup
修改
如果您使用AWT Popup
或将Swing lightweight
与AWT heavyweight
组件混合使用,那么您必须查看Swing Utils by Darryl