gpt4 book ai didi

java - Swing 祖先监听器 : Don't fire for tab switching?

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:06 24 4
gpt4 key购买 nike

我正在使用以下代码让我的组件在分别添加/删除时注册/注销事件监听器。

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() 检查它来修复。


(对于那些熟悉 Flash/AS3 的人,我正在寻找与 ADDED_TO_STAGE/REMOVED_FROM_STAGE 事件等效的 Swing。)

最佳答案

通过使用 HierarchyListener 修复。

public static void addDisplayableListeners(final Component comp, final Runnable onDisplayable, final Runnable onNotDisplayable) {
comp.addHierarchyListener(new HierarchyListener() {
@Override public void hierarchyChanged(HierarchyEvent e) {
System.out.println("HIERARCHY CHANGE ===== " + comp);
final boolean dc = (e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0;
if (dc) {
System.out.println("DISPLAYABILITY_CHANGED");
if (comp.isDisplayable()) {
onDisplayable.run();
} else {
onNotDisplayable.run();
}
}
}
});
}

旧版本:

    addHierarchyListener(new HierarchyListener() {

private boolean hadRoot = false;

@Override public void hierarchyChanged(HierarchyEvent e) {

System.out.println("HIERARCHY CHANGE ===== " + ContentViewingComponent.this);

final boolean hasRoot = Swing.hasRoot(ContentViewingComponent.this);
System.out.println("Has root: " + hasRoot);

if (hasRoot != hadRoot) {

System.out.println("...which is not what was.");
hadRoot = hasRoot;

if (hasRoot) {
log.info("========= Add listeners by " + ContentViewingComponent.this);
...
} else {
log.info("========= Remove listeners by " + ContentViewingComponent.this);
...
}
}

}
});

注意:我会看看我是否可以用@mKorbel 的回答中提到的官方方法替换我自己的助手(hadRoothasRoot())。

关于java - Swing 祖先监听器 : Don't fire for tab switching?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com