次のコードを使用して、コンポーネントが追加/削除されたときにイベントリスナーを登録/登録解除できるようにしています。
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を探しています。)