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