Java 7.x中的validateTree不起作用(在Java 6.x中很好)

我的java版本是:

Java Plug-in 10.3.1.255使用JRE版本1.7.0_03-b05 Java HotSpot(TM)客户端VM

所以,当我有版本6.x一切都很好,升级后我得到了这个:

    线程“AWT-EventQueue-0”中的exceptionjava.lang.IllegalStateException:在java.awt.Container.validateTree(Container)的java.awt.Component.checkTreeLock(Component.java:1196)中保存treeLock时应该调用此函数。 java:1682)在pl.recorder.actions.UwloadFilesAction.exe执行(DesignFilesAction.java:71)pl.recorder.actions.EndTestAction.actionPerformed(EndTestAction.java)的pl.recorder.ScenarioWindow.showUploadPanel(PlayerWindow.java:721) :91)at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)at javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2341)at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)在javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)的javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)at java.awt.Component.processMouseEvent(Component.java:6505)at at java.aw上的javax.swing.JComponent.processMouseEvent(JComponent.java:3321)  t.Component.processEvent(Component.java:6270)位于java.awt.Container.dispatchEventImpl的java.awt.Container.ventEvent(Container.java:2229)java.awt.Component.dispatchEventImpl(Component.java:4861) (Container.java:2287)位于java.awt.LightweightDispatcher.processMouseEvent(Container.java:4832)的java.awt.Component.dispatchEvent(Component.java:4687)java.awt.LightweightDispatcher.processMouseEvent(Container.java: 4492)java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)at java.awt.Container.dispatchEventImpl(Container.java:2273)at java.awt.Window.dispatchEventImpl(Window.java:2713)at java。位于java.awt.EventQueue.access的java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)中的awt.Component.dispatchEvent(Component.java:4687)$ 000(EventQueue.java:101)at java.awt.EventQueue $ 3 .run(EventQueue.java:666)java.awt.EventQueue $ 3.run(EventQueue.java:664)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionP  rivilege(ProtectionDomain.java:76)java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:87)at java.awt.EventQueue $ 4.run(EventQueue.java:680)at java.awt.EventQueue $ 4.run( EventQueue.java:678)java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76)at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)at at Java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)java.awt.EventDispatchThread .pumpEvents(EventDispatchThread.java:113)位于java.awt.EventDispatchThread.run的java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)中(EventDispatchThread.java:90) 

我将validateTree()更改为validate()和suprise;) – everthing工作正常,但我不知道这个更改是否也适用于java 6.x(我猜不是)。 如何更改此代码以在Java 6x和7x中工作。

“这不是bug,它是java 7的一个特性”;)

应该在保存treeLock时调用此函数

这是强迫你写作:

 synchronized(getTreeLock()) { validateTree(); } 

在回应@ vince的答案时,我认为查看该方法的Java 1.4.2 javadoc所说的内容是有益的:

protected void validateTree()

递归地下降容器树并重新计算标记为需要的任何子树的布局(标记为无效的子树)。 应该通过调用此方法的方法提供同步: validate

(重点补充。)

我读这个的方式,就是说该方法被设计为由validate()调用,它会(可能)持有树锁。

请注意,Java 6和Java 7中的文本完全相同。规范没有改变……

现在显然有应用程序代码直接调用validateTree()而没有获取树锁。 据推测,当最终用户点击太快或某事时,这会导致无法解决的问题(Heisenbugs)。 据推测,Java 7中的更改旨在将validateTree()错误/错误使用引入开发人员的注意力。

好的,这是短暂的痛苦。 但从长远来看, 每个人都获胜(除了律师:-)):

  • Oracle没有针对奇怪的不可重现的行为获取错误报告,这些行为确实是应用程序员的问题。

  • 开发人员不会从客户那里收到奇怪的不可复制行为的错误报告。

  • 最终用户获得更好的应用程序。

我不完全确定,但我认为你可以使用:

 System.getProperty("java.version"); 

只需检查是否为6或7,并根据具体情况做一些不同的事情。