gpt4 book ai didi

Java Swing : getAncestorOfClass() not working as expected

转载 作者:行者123 更新时间:2023-12-02 11:50:49 25 4
gpt4 key购买 nike

我们的 Java 产品有一个主要的 JToolBar,其中,从某个点开始,几个后台线程可以添加新的 JButton,从最右边开始,根据某些满足条件的警报。他们的惯例。所以,我们的主框架有一个像这样的私有(private)属性:

private final Component featuresHorizontalGlue = Box.createHorizontalGlue();

当报警线程刷新时,它们首先调用

private synchronized void manageHorizontalGlue(boolean toBeAdded) {
if (toBeAdded) {
if (SwingUtilities.getAncestorOfClass(toolbar.getClass(), featuresHorizontalGlue) == null) {
logger.debug("Adding Horizontal Glue to main ToolBar");
toolbar.toolbar.add(featuresHorizontalGlue);
}
}
}

因为Horizo​​ntalGlue组件应该是唯一的,以便后续添加的每个警报按钮都将右对齐。当第一次在工具栏中添加警报按钮时,会调用类似的方法,然后只需在图标中刷新它们即可。无论如何,我的一位前同事实现了一些方法,如果满足其他条件,主工具栏将被完全处置并重新创建。因此,我期望我的警报方法工作正常,但事实并非如此,因为即使在 toolbar 上调用新的构造函数,getAncestorOfClass() 返回不为 null,因此水平胶水和警报按钮不再重新添加和显示。为什么这个?如果我在 Eclipse 上调试工具栏内的 Components[] 数组,我将无法再看到这些按钮和 Horizo​​ntalGlue 组件。那么,为什么该方法不返回 null?

最佳答案

显然你误解了这个方法的目的,这很奇怪,因为它的名称“getAncestorOfClass”清楚地表明它将返回一个具有匹配类的祖先,而不一定是你在头脑。如果这还不够,您可以将 toolbar.getClass() 传递给它,而不是 toolbar 实例。所以它甚至无法检查是否是同一个实例;它只会返回任何祖先 JToolBar 实例(如果有的话),例如旧的工具栏。

最后,如果你想知道 toolbar 是否是 featuresHorizo​​ntalGlue 的祖先,可以使用 toolBar.isAncestorOf(featuresHorizo​​ntalGlue) 直接测试它)。无需研究任何额外的实用程序类。

除此之外,当我读到“几个后台线程可以添加新的 JButton”时,我希望您已经阅读并理解 Swing’s Threading Policy ...

关于Java Swing : getAncestorOfClass() not working as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47885019/

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