2011-12-27 17 views
2

現在画面に表示されているすべてのJPopupMenuコンポーネントのリストを取得する方法。
可視性、有効性などでフィルタリングできるすべてのJPopupMenuコンポーネントを入手してください。
私はテストを書くためにこれが必要です。 JPopupMenu-sは、親子(コンテナコンポーネント)の関係の一部ではありません。現在表示されているすべてのJPopupMenuを一覧表示します。

ありがとうございました。

解決

:JPopupMenuのは、我々はフェストのフレームワークを使用してスイングを持つすべてのユニットテストのための窓であり、これは(java.awt.Window.getWindowsに記載されている)

+0

を見つけましたその地域の一部は所有者のトップレベルの祖先の外にあります。軽い場合は、rootPaneのlayeredPaneのポップアップレイヤーに表示されます – kleopatra

+0

忘れてしまった:wondering - なぜいくつかのポップアップが必要ですか?一般的なルールとしては、常に特定のポップアップが表示されます(これはまだ見つかる必要があります:-)。そのルールの1つの例外は、サブメニューです。これはあなたの後にあるかもしれません。結局のところ、なぜこの質問が沸騰しているように見えるのですか?あなたは何を達成したいのですか? – kleopatra

答えて

1

JPopupMenuのはウィンドウであり、それは(java.awt.Window.getWindowsに記載されている)

2

。あなたがポップアップメニューのものをテストすることができるポップアップメニューフィクスチャがあります。私はあなたがJPopupMenuをに設定した名前で検索することで示される全ポップアップメニューを検索することができます確信しているフレームワークを使用して

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

編集: フレームワークのメンテナンスは数年前に変更されました。ご使用の前にご確認ください。

+0

リンクが死んでいます... – Adam

+0

ありがとうございます。回答 – sethu

2

コメント光とヘビー懸念によってもたらされるよう、これは些細なことではない示すよう...たとえば、いくつかのケースで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; 
} 
+0

を編集したのは、コンテナの反復処理ですぐに最初の結果を返すことですか?私はあなたが最初の非null結果を返したいと思う – Hachi

関連する問題