다음 코드를 사용하여 구성 요소를 추가/제거 할 때 이벤트 수신기를 등록/등록 취소 할 수 있습니다.Swing AncestorListener : 탭 전환을 실행하지 않습니까?
addAncestorListener(new AncestorListener() {
@Override public void ancestorRemoved(AncestorEvent event) {
log.info("========= Remove listeners by " + ContentViewingComponent.this);
...
}
@Override public void ancestorMoved(AncestorEvent event) {}
@Override public void ancestorAdded(AncestorEvent event) {
log.info("========= Add listeners by " + ContentViewingComponent.this);
...
}
});
내 의도는 두 이벤트 모두 (추가 및 제거) 기본적으로 대부분의 상황에서 한 번 해고이었다, 즉 구성 요소가 추가 & 생성되고이 잊어 &을 제거 할 때 때.
그러나이 구성 요소가있는 탭 (JTabbedPane
)이 선택되거나 숨겨지면 해고된다는 것을 알고 있습니다. 그것을 우회/탐지하는 방법이 있습니까?
아마도 추가/제거 대신 표시/숨기기를 사용하는 업데이트 : 더 많은 조사 결과에 따르면 구성 요소가 실제로 제거되지는 않지만 숨겨진 탭이 표시되고 JTabbedPane
의 버전일까요?ancestorRemoved()
도 실행됩니다. 구성 요소가 여전히 루트 *를 가지고 있는지 여부를 감지 할 수 있으면 이벤트를 무시할 수 있지만 구성 요소가 실제로 제거되면 (보이지 않는 동안에는) 다시 시작되지 않는 문제가 있습니다.
* 글쎄요. 실제 제거하기 전에 업데이트 : ancestorRemoved()
이 실행됩니다. 따라서 getParent()
체인을 따라 가야 구성 요소의 루트가 있는지 여부를 알 수 없습니다.SwingUtilities.invokeLater()
을 사용하여 한 번에 확인하여 해결되었습니다.
(플래시/AS3에 익숙한 사람들을 위해, 나는
ADDED_TO_STAGE
/
REMOVED_FROM_STAGE
이벤트의 스윙 상당을 찾고 있어요.)
스윙 청취자는 그들이 발동 할 때 발사합니다. 그러나 리스너의 if 문을 사용하여 원하는 이벤트에 대해서만 코드를 실행할 수 있습니다. –
@GilbertLeBlanc 예,하지만 문제가 있습니다. 나는 "보이지 않는"것을 의미하는 이벤트를 무시할 수 있습니다.하지만 구성 요소가 제거되면 (보이지 않는 동안에도) 알려주지 않습니다. –