gpt4 book ai didi

java - 查找组合框弹出窗口的所有者

转载 作者:行者123 更新时间:2023-11-29 07:12:52 25 4
gpt4 key购买 nike

我有一个向用户显示设置的弹出窗口。如果您在其外部单击,它会隐藏,但如果您在内部单击,它仍然可见。

处理此行为的事件处理程序获取 Component(已单击)并通过递归地使用 component.getParent() 我可以检查它是否是我的设置的子项控制板。到目前为止,这是有效的。

但我只是在该面板中添加了一个 JComboBox,事实证明“可选项目弹出窗口”(它有名称吗?)组合框在单击时显示不是组合框的子项。尝试在组合框中选择某些内容会隐藏我的设置面板。

使用 NetBeans 调试器,我可以看到它的类型为 BasicComboPopup$1(这是一个匿名类吗?),但它不是 ComboPopup 的实例, JPopupMenuBasicComboPopup

我需要一种方法来识别被单击的“组合框弹出窗口”的所有者/父组合框。

最佳答案

不完全确定,但您可能正在寻找

 popup.getInvoker();

这将返回调用组合框。

下面的实用方法(从 SwingX 框架附带的 SwingXUtilities 复制):假设您找到了事件的源组件(不幸的是,该方法中的命名是 focusOwner ;-),它会检查该源是否位于父级下方的某个位置,包括弹出窗口。

刚刚注意到您的父窗口是一个弹出窗口,所以您必须稍微调整一下逻辑,切换第一个和第二个 if block (虽然没有尝试 - 有多个可见的弹出窗口是不寻常的。:- )

/**
* 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;
}

关于java - 查找组合框弹出窗口的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12108778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com