コメント光とヘビー懸念によってもたらされるよう、これは些細なことではない示すよう...たとえば、いくつかのケースでJPopupMenuのをすることができJRootPaneの内部にネストされます。しかし、これは代替のパブリックAPI(JPopupMenusのリストを取得するために使用できるjavax.swing.MenuSelectionManager)で使用されます。ヘビー級である場合にのみ、別のウィンドウに示されます、デフォルトで、それならばそれはケースのみです:私は用心Window.getWindowsを使用して、この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;
}
内部のオリジナルソリューション()
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
忘れてしまった:wondering - なぜいくつかのポップアップが必要ですか?一般的なルールとしては、常に特定のポップアップが表示されます(これはまだ見つかる必要があります:-)。そのルールの1つの例外は、サブメニューです。これはあなたの後にあるかもしれません。結局のところ、なぜこの質問が沸騰しているように見えるのですか?あなたは何を達成したいのですか? – kleopatra