Miz*_*zor 1 java swing awt jcombobox jpopup
我有一个弹出窗口,向用户显示设置.如果你点击它外面,它隐藏但如果你点击其中它仍然可见.
处理此行为的事件处理程序获取Component(被单击)并通过component.getParent()递归使用我可以检查它是否是我的设置面板的子项.到目前为止这已经奏效了.
但是我刚刚JComboBox在该面板中添加了一个,结果是"可选项弹出"(它有一个名字?)组合框在点击时显示的不是组合框的孩子.尝试在组合框中选择某些内容会隐藏我的设置面板.
使用NetBeans调试器我可以看到它的类型BasicComboPopup$1(是一个匿名类?),但它既不是ComboPopup,JPopupMenu也不是BasicComboPopup.
我需要一种方法来识别被点击的"组合框弹出窗口"的所有者/父组合框.
不完全确定,但你可能正在寻找
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)
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |