我正在使用以下代码让我的组件分别在添加/删除时注册/取消注册事件侦听器。
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
但是,事实证明,当该组件所在的选项卡 (of ) 被选中/隐藏时,它们也会被触发。有没有办法规避/检测到它?
也许一个版本更新:更多调查显示该组件实际上并未被删除,而是隐藏了选项卡,并且JTabbedPane
使用显示/隐藏而不是添加/删除?ancestorRemoved()
也因此而触发。我可以检测组件是否仍然具有 root* 并忽略该事件(如果有),但问题是当组件实际被移除(不可见时)时它不会再次被触发。
*好吧,这还有待观察。它在实际删除之前似乎更新:通过稍后使用ancestorRemoved()
会触发,所以我无法沿着getParent()
链查找组件是否有根。SwingUtilities.invokeLater()
.
(对于那些熟悉 Flash/AS3 的人,我正在寻找与ADDED_TO_STAGE
/REMOVED_FROM_STAGE
事件等效的 Swing。)