找到combobox弹出窗口的所有者

Miz*_*zor 1 java swing awt jcombobox jpopup

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

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

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

使用NetBeans调试器我可以看到它的类型BasicComboPopup$1(是一个匿名类?),但它既不是ComboPopup,JPopupMenu也不是BasicComboPopup.

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

kle*_*tra 5

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

 popup.getInvoker();
Run Code Online (Sandbox Code Playgroud)

这将返回调用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;
}
Run Code Online (Sandbox Code Playgroud)