Список всех JPopupMenu в настоящее время показано - PullRequest
2 голосов
/ 27 декабря 2011

Как получить список всех компонентов JPopupMenu, которые в данный момент отображаются на экране.
Или получите все компоненты JPopupMenu, которые затем можно отфильтровать по видимости, достоверности и т. Д.
Мне это нужно для написания тестов. Застрял в JPopupMenu-s не является частью отношений родитель-потомок (контейнер-компонент).

Спасибо.


решено: JPopupMenu - это Window, и оно указано в java.awt.Window.getWindows ()

Ответы [ 3 ]

2 голосов
/ 16 декабря 2016

Как показывают комментарии, это не тривиально, так как это связано с легкими и тяжелыми проблемами ... Например, в некоторых случаях 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 голосов
/ 27 декабря 2011

Для всех юнит-тестов со свингом мы используем каркас Fest.Есть всплывающее меню, которое позволит вам проверить содержимое всплывающего меню.

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

Используя фреймворк, я уверен, что вы можете искать все всплывающие меню, отображаемые с помощью имени, которое вы задали для JPopupMenu.

РЕДАКТИРОВАТЬ: обслуживание рамок перешло в руки несколько лет назад.Пожалуйста, проверьте перед использованием.

1 голос
/ 29 апреля 2012

JPopupMenu - это Window, и оно указано в java.awt.Window.getWindows ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...