【发布时间】:2013-03-21 15:54:11
【问题描述】:
我正在使用以下代码让我的组件在添加/删除时分别注册/取消注册事件侦听器。
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()也为此着火。我可以检测组件是否仍然具有 root* 并忽略该事件(如果有),但问题是当组件实际被移除(不可见时)时它不会再次触发。
*嗯,这还有待观察。似乎 更新:通过稍后使用ancestorRemoved() 在实际删除之前触发,所以我无法沿着getParent() 链查找组件是否有根。SwingUtilities.invokeLater() 检查它来修复。
(对于那些熟悉 Flash/AS3 的人,我正在寻找与 ADDED_TO_STAGE/REMOVED_FROM_STAGE 事件等效的 Swing。)
【问题讨论】:
-
Swing 监听器在触发时会触发。但是,您可以在侦听器中使用 if 语句仅针对您想要的事件执行代码。
-
@GilbertLeBlanc 是的,但是有一个问题。我可以忽略一个仅表示“不可见”的事件,但如果该组件随后被移除(不可见),它不会让我知道。
标签: java swing jtabbedpane ancestor