Java Swing:getAncestorOfClass() 未按预期工作

Java Swing: getAncestorOfClass() not working as expected

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

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() return 也不会为 null,因此水平粘合和警报不再重新添加和显示按钮。 为什么这个? 如果我在 Eclipse 上使用调试检查工具栏内的 Components[] 数组,我将再也看不到那些按钮和 HorizontalGlue 组件。那么,为什么该方法不 return null?

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

最后如果想知道toolbar是不是featuresHorizontalGlue的祖先,可以直接用toolBar.isAncestorOf(featuresHorizontalGlue)测试一下。无需研究任何额外的实用程序 class.

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