找到combobox弹出窗口的所有者

时间:2012-08-24 11:42:50

标签: java swing awt jcombobox jpopup

我有一个向用户显示设置的弹出窗口。如果你点击它外面,它隐藏但如果你点击里面它仍然可见。

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

但是我刚刚向该面板添加了一个JComboBox,结果是“可选项弹出”(它有一个名字?)组合框在点击时显示的不是组合框的子项。尝试在组合框中选择某些内容会隐藏我的设置面板。

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

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

2 个答案:

答案 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)

  1. 不确定你是否在谈论

    • mouse活动

    • keyboard活动

    • mousekeyboard事件

  2. 查看SwingUtilities child v.s.的方法parent,反之亦然

  3. 发布SSCCE,其中包含有关所需事件的详细说明,因为有一些方法可以从Popup

    JComboBox >

    修改

    如果您使用AWT Popup或将Swing lightweightAWT heavyweight组件混合使用,那么您必须查看Swing Utils by Darryl