列出当前显示的所有JPopupMenu

时间:2011-12-27 10:33:44

标签: java swing

如何获取屏幕上当前显示的所有JPopupMenu组件的列表 或者获取所有可以通过可见性,有效性等过滤的JPopupMenu组件 我需要这个来编写测试。坚持JPopupMenu-s不是父子(容器组件)关系的一部分。

感谢。


已解决:JPopupMenu是Window,它在java.awt.Window.getWindows()中列出

3 个答案:

答案 0 :(得分:2)

对于所有使用swing的单元测试,我们使用Fest框架。有一个弹出菜单夹具,允许您在弹出菜单上测试内容。

https://github.com/alexruiz/fest-swing-1.x

使用框架我相信您可以使用您为JPopupMenu设置的名称搜索所有显示的弹出菜单。

编辑: 几年前,框架维护易手。请在使用前检查。

答案 1 :(得分:2)

正如评论所显示的那样,轻微和重量级问题对此并非微不足道......例如,在某些情况下,JPopupMenu可以嵌套在JRootPane中。然而,这在使用的替代公共API中 - javax.swing.MenuSelectionManager可用于获取JPopupMenus的列表。我在javax.swing.plaf.basic.BasicPopupMenuUI.getPopups()

中找到了这个
static List<JPopupMenu> getPopups() {
    MenuSelectionManager msm = MenuSelectionManager.defaultManager();
    MenuElement[] p = msm.getSelectedPath();

    List<JPopupMenu> list = new ArrayList<JPopupMenu>(p.length);
    for (MenuElement element : p) {
        if (element instanceof JPopupMenu) {
            list.add((JPopupMenu) element);
        }
    }
    return list;
}

使用Window.getWindows()

的原始解决方案
private boolean isPopupMenuOpen() {
    for (Window each : Window.getWindows()) {
        if (findPopup(each) != null) {
            return true;
        }
    }
    return false;
}

private JPopupMenu findPopup(Component root) {
    if (root instanceof JPopupMenu) {
        return (JPopupMenu) root;
    }
    if (root instanceof JWindow) {
        return findPopup(((JWindow)root).getContentPane());
    }
    if (root instanceof JRootPane) {
        return findPopup(((JRootPane)root).getLayeredPane());
    }
    if (root instanceof Container) {
        for (Component each : ((Container) root).getComponents()) {
            return findPopup(each);
        }
    }
    return null;
}

答案 2 :(得分:1)

JPopupMenu是Window,它在java.awt.Window.getWindows()中列出