次のコードを使用して、コンポーネントが追加/削除されたときにイベントリスナーを登録/登録解除できるようにしています。
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);
...
}
});
私の意図は、両方のイベント(追加と削除)が基本的にほとんどの状況で1回発生することでした。つまり、コンポーネントが作成および追加されたときと、コンポーネントが削除および忘れられたときです。
JTabbedPaneただし、このコンポーネントが含まれている(の)タブが選択/非表示になったときにも起動されることがわかります。それを回避/検出する方法はありますか?
たぶん、そのバージョンは更新:詳細な調査によると、コンポーネントは実際には削除されていませんが、タブは非表示になっており、JTabbedPane、追加/削除の代わりに表示/非表示を使用しますか?ancestorRemoved()そのためにも起動します。コンポーネントにまだルート*があるかどうかを検出し、ある場合はイベントを無視できますが、問題は、コンポーネントが実際に削除されたときに(非表示のときに)再度起動されないことです。
*まあ、それはまだ分からない。実際に取り外す前に発火したように見える更新:1ステップ後にを使用してチェックすることで修正されましたancestorRemoved()ので、チェーンを上ってgetParent()コンポーネントにルートがあるかどうかを確認することはできません。SwingUtilities.invokeLater()。
ADDED_TO_STAGE(Flash / AS3に精通している人のために、 /REMOVED_FROM_STAGEイベントに相当するSwingを探しています。)