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



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

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

但我只是在那个面板上添加了一个JComboBox,结果发现点击时组合框显示的"可选择项目弹出窗口"(它有名字吗?)并不是组合框的子项。试图在组合框中选择某些内容会隐藏我的设置面板。

使用NetBeans调试器,我可以看到它的类型为BasicComboPopup$1(那是一个匿名类吗?),但它既不是ComboPopupJPopupMenu也不是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;
}
  1. 不确定你是否在谈论

    • mouse事件

    • keyboard事件

    • mousekeyboard事件

  2. 看看SwingUtilities,有childparent的方法,反之亦然

  3. 发布SSCCE,详细描述所需事件,因为有几种方法可以从JComboBox 中提取和修改Popup

编辑

在使用AWT Popup或将Swing lightweightAWT heavyweight组件混合的情况下,必须查看Darryl 的Swing Utils

相关内容

  • 没有找到相关文章

最新更新