Java Swing:getAncestorOfClass()无法按预期工作

问题描述 投票:0回答:1

我们的Java产品有一个主要的JToolBar,从某一点开始,一些后台线程可以添加新的JButton,从最右边开始,作为警报,根据他们的例程中的一些满足条件。所以,我们的主框架有一个私有属性,如下所示:

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);
        }
    }
}

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

java swing user-interface jbutton jtoolbar
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.