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