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,并根据具体情况做一些不同的事情。
- 正在使用的远程方法调用端口
- JavaFX 2.0 + FXML。 从其他任务更新场景值
- Struts 2参数编码问题在重定向到另一个动作期间
- QueryDsl错误。 没有生成Q类
- java.lang.NoClassDefFoundError:org / apache / xpath / XPathAPI
- Webdriver – HTTP身份validation对话框
- 为什么我必须在@Constructor注释注释的Spring配置类中有一个默认构造函数?
- 使用MyFaces和WASCE / Geronimo时的java.lang.ClassNotFoundException:com.sun.faces.config.ConfigureListener
- ImageJ打开imagePlus窗口作为desktopPane内部的框架