【问题标题】:Java Swing: getAncestorOfClass() not working as expectedJava Swing:getAncestorOfClass() 未按预期工作
【发布时间】:2017-12-19 10:35:52
【问题描述】:

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

【问题讨论】:

  • 我们无法回答您的问题,因为我们看不到您的代码。请提供一个简短的可运行示例 (SSCCE),以便我们也可以重现您的问题并对其进行调试以找到解决方案。
  • 对不起,但我只是想知道如果我误解了任何内容,`getAncestorOfClass()` 是如何工作的。恐怕要给出一个简短的可运行示例并不简单,因为我目前正在使用的包非常大,并且有很多类和方法导致......工具栏也非常复杂。对不起。

标签: java swing user-interface jbutton jtoolbar


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢您,您非常感谢您。正如我所担心的那样,我完全误解了这种方法。我承认我既不擅长使用这些实用程序类也不擅长使用 Swing……无论如何,我也很欣赏你关于 Swing 线程策略的提示。实际上,每次需要添加或删除按钮,或者更改其图标时,我都会使用SwingUtilities.invokeLater()。非常感谢。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2012-06-29
  • 1970-01-01
  • 2017-12-27
  • 2014-05-18
相关资源
最近更新 更多