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

时间:2017-12-19 10:35:52

标签: java swing user-interface jbutton jtoolbar

我们的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?

1 个答案:

答案 0 :(得分:1)

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

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

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