我们的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?
显然你误解了这个方法的目的,这很奇怪,因为它的名字“getAncestorOfClass
”清楚地表明它将返回一个具有匹配类的祖先,不一定是你想到的实例。如果这还不够,你将toolbar.getClass()
传递给它,而不是toolbar
实例。所以它甚至无法检查它是否是同一个实例;它将简单地返回任何祖先JToolBar
实例,如果有一个,例如旧工具栏。
最后,如果你想知道toolbar
是否是featuresHorizontalGlue
的祖先,你可以使用toolBar.isAncestorOf(featuresHorizontalGlue)
直接测试它。无需查看任何额外的实用程序类。
除此之外,当我读到“几个背景线程可以添加新的JButton”时,我希望,你已阅读并理解Swing’s Threading Policy ......