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