2010-01-27 2 views
1

나는 Window 클래스 높은 수준의 렌더링 할 수있는는 '일반적인'JPanel 만들려면 (JFrame, JDialog, 또는 JInternalFrame 다소 정확하기를.)부모/조상 컨테이너의 windowClosing/닫힌 리스너로 JPanel을 후크하는 방법은 무엇입니까?

내가 '정리'할 수 있도록하려면 그 윈도우가 더 이상 스크린 상에 렌더되지 않을 때의 정적 인 값. 일반적으로 Window 클래스 (예 : JFrame)로 수행하고 을 생성하는 동안 windowClosing 또는 windowClosed 메소드를 사용하면 간단히 addWindowListener이됩니다.

Window 클래스를 렌더링 할 수 있기를 원하기 때문에 어떤 리스너를 추가할지 알지 못하거나 추가 할 윈도우를 알지도 못합니다.

JPanel의 구현과 렌더링을 '후크 (hook)'하여 Window 클래스가 렌더링하는 것과 관계없이 종료 된 후크를 추가 할 수 있습니까?

은 (내가 PropertyChangeListener 보았다하지만 componentShownJPanel 렌더링을 트리거하지 않습니다.)

어떤 도움을 주시면 감사하겠습니다.

답변

0

원하는 의미에 따라 몇 가지 옵션이 있습니다. ComponentListener을 등록하고 componentHidden 메소드를 처리 할 수 ​​있습니다. 또 다른 가능성은 HierarchyListener을 등록하고 DISPLAYABILITY_CHANGED 이벤트를 확인하는 것입니다. HierarchyListener을 사용하여 패널이 컨테이너에서 추가 또는 제거 된시기를 찾고 이전 및 새 창에서 창 수신기를 추가/제거 할 수 있습니다. ComponentListenerHierarchyListener의 차이는 패널의 창을 처리 할 때 HierarchyListener/DISPLAYABILITY_CHANGED 이벤트가 트리거되는 동안 모든 가시성 변경에 의해 ComponentListener이 트리거된다는 것입니다. ComponentListener이 최선의 방법 일 수 있지만 앞으로 패널이 다시 표시되도록 설정 될 수 있습니다.

AncestorListenerancestorRemoved 이벤트를 시도 할 수도 있습니다. 구성 요소 자체 또는 그 조상 중 하나가 보이지 않게되는 경우 호출됩니다.

+1

구성 요소/JPanel 자체가 가시성 속성을 변경하지 않아서 숨겨진 창이 닫히는 경우 '숨김'되지 않습니다. 단순히 더 이상 렌더링되지 않습니다. 하지만 HierarchyListener를 살펴 보겠습니다. –

+0

HierarchyListener가 AncestorListener보다 나은 솔루션이라고 생각합니다. 잘 작동합니다. 고마워, 제프. –

2

글쎄, 마침내 뭔가 효과가 있었지만 나는 정말로 대답을 좋아하지 않습니다.

작성시 AncestorListenerJPanel에 추가했습니다. 이 청취자는 ancestorRemovedancestorMoved 이벤트를 외기고 ancestorAdded 이벤트의 경우 getTopLevelAncestor()을 적절한 WindowListener/InternalFrameListener으로 연결하여 창이 닫힐 때 종료 코드를 실행할 수 있습니다.

더 좋은 방법이 있다면 나는 그것에 대해 열려 있습니다. (Geoff의 HierarchyListener을 검토 할 예정입니다.)

관련 문제