에 나열되어 있습니다 ... 예를 들어 어떤 경우에 JPopupMenu를이 될 수 있습니다 JRootPane의 내부에 상자가되어 있습니다. JPopupMenus의리스트를 취득하기 위해서 사용할 수있는 javax.swing.MenuSelectionManager. 나는 조심 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;
}
를이 발견 : 그것은 기본적으로 헤비급 경우에만 별도의 창에 표시 것, 그것은 단지 사건 그것을 경우 그 지역의 일부는 그 주인의 최상위 조상 밖에있다. 가볍다면 rootPane의 layeredPane – kleopatra
의 팝업 레이어에 표시됩니다. 궁금합니다 - 왜 여러 팝업을 기대합니까? 일반적으로 특정 시간에 볼 수있는 정확히 하나의 팝업 (여전히 찾을 필요가있는 :-)이 있습니다. 이 규칙에 대한 예외는 하위 메뉴입니다. 이는 하위 항목이 될 수도 있습니다. 결국, 왜 질문이 내려 질 것인가 : 당신은 무엇을 달성하기를 원합니 까? – kleopatra