2011-12-27 2 views
2

현재 화면에 표시된 모든 JPopupMenu 구성 요소의 목록을 가져 오는 방법.
또는 가시성, 유효성 등으로 필터링 할 수있는 모든 JPopupMenu 구성 요소를 얻으십시오.
필기 테스트에는이 기능이 필요합니다. JPopupMenu-s는 부모 - 자식 (컨테이너 - 컴포넌트) 관계의 일부가 아닙니다.현재 표시된 모든 JPopupMenu 나열

감사합니다.


해결 : JPopupMenu의 창이며, 우리가 축제 프레임 워크를 사용하여() 스윙 모든 단위 테스트에 대한

+0

를이 발견 : 그것은 기본적으로 헤비급 경우에만 별도의 창에 표시 것, 그것은 단지 사건 그것을 경우 그 지역의 일부는 그 주인의 최상위 조상 밖에있다. 가볍다면 rootPane의 layeredPane – kleopatra

+0

의 팝업 레이어에 표시됩니다. 궁금합니다 - 왜 여러 팝업을 기대합니까? 일반적으로 특정 시간에 볼 수있는 정확히 하나의 팝업 (여전히 찾을 필요가있는 :-)이 있습니다. 이 규칙에 대한 예외는 하위 메뉴입니다. 이는 하위 항목이 될 수도 있습니다. 결국, 왜 질문이 내려 질 것인가 : 당신은 무엇을 달성하기를 원합니 까? – kleopatra

답변

1

JPopupMenu를이 창이며 코멘트 라이트 헤비급 우려 영향으로이 사소한하지 쇼로가 java.awt.Window.getWindows()

2

java.awt.Window.getWindows에 나열되어 있습니다. 팝업 메뉴에서 물건을 테스트 할 수있는 팝업 메뉴가 있습니다. 나는 당신이 JPopupMenu를 설정 이름으로 검색하여 표시된 모든 팝업 메뉴를 검색 할 수 있습니다 확신 프레임 워크를 사용

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

.

편집 : 몇 년 전에 프레임 워크 유지 관리가 변경되었습니다. 사용하기 전에 확인하십시오.

+0

링크가 죽었습니다 ... – Adam

+0

고마워요. 대답 – sethu

2

에 나열되어 있습니다 ... 예를 들어 어떤 경우에 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; 
} 
+0

을 편집하면 컨테이너 반복에서 첫 번째 결과가 즉시 반환됩니까? 첫 번째 null이 아닌 결과로 돌아가고 싶었던 것 같습니다. – Hachi

관련 문제