Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 7.x中的validateTree不起作用(在Java 6.x中还可以)_Java_Swing_Java 7_Java 6 - Fatal编程技术网

Java 7.x中的validateTree不起作用(在Java 6.x中还可以)

Java 7.x中的validateTree不起作用(在Java 6.x中还可以),java,swing,java-7,java-6,Java,Swing,Java 7,Java 6,我的java版本是: 使用JRE版本1.7.0_03-b05 Java HotSpot(TM)客户端虚拟机的Java插件10.3.1.255 因此,当我有6.x版时,一切都很好,升级后,我得到了: Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: This function should be called while holding treeLock at java.awt.Compo

我的java版本是:

使用JRE版本1.7.0_03-b05 Java HotSpot(TM)客户端虚拟机的Java插件10.3.1.255

因此,当我有6.x版时,一切都很好,升级后,我得到了:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: This function should be called while holding treeLock at java.awt.Component.checkTreeLock(Component.java:1196) at java.awt.Container.validateTree(Container.java:1682) at pl.recorder.ScenarioWindow.showUploadPanel(PlayerWindow.java:721) at pl.recorder.actions.UploadFilesAction.execute(DesignFilesAction.java:71) at pl.recorder.actions.EndTestAction.actionPerformed(EndTestAction.java: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) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) at java.awt.Component.processMouseEvent(Component.java:6505) at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) at java.awt.Component.processEvent(Component.java:6270) at java.awt.Container.processEvent(Container.java:2229) at java.awt.Component.dispatchEventImpl(Component.java:4861) at java.awt.Container.dispatchEventImpl(Container.java:2287) at java.awt.Component.dispatchEvent(Component.java:4687) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) at 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.awt.Component.dispatchEvent(Component.java:4687) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at 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) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 线程“AWT-EventQueue-0”java.lang.IllegalStateException中的异常:应在保持treeLock时调用此函数 位于java.awt.Component.checkTreeLock(Component.java:1196) 位于java.awt.Container.validateTree(Container.java:1682) 在pl.recorder.ScenarioWindow.showUploadPanel(PlayerWindow.java:721) 在pl.recorder.actions.UploadFilesAction.execute(DesignFilesAction.java:71) 在pl.recorder.actions.EndTestAction.actionPerformed处(EndTestAction.java:91) 在javax.swing.AbstractButton.fireActionPerformed上(AbstractButton.java:2018) 位于javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 在javax.swing.DefaultButtonModel.fireActionPerformed上(DefaultButtonModel.java:402) 在javax.swing.DefaultButtonModel.setPressed中(DefaultButtonModel.java:259) 在javax.swing.plaf.basic.BasicButtonListener.MouseRelease(BasicButtonListener.java:252) 位于java.awt.Component.ProcessMouseeEvent(Component.java:6505) 位于javax.swing.JComponent.ProcessMouseeEvent(JComponent.java:3321) 位于java.awt.Component.processEvent(Component.java:6270) 位于java.awt.Container.processEvent(Container.java:2229) 位于java.awt.Component.dispatchEventImpl(Component.java:4861) 位于java.awt.Container.dispatchEventImpl(Container.java:2287) 位于java.awt.Component.dispatchEvent(Component.java:4687) 位于java.awt.LightweightDispatcher.RetargetMouseeEvent(Container.java:4832) 位于java.awt.LightweightDispatcher.ProcessMouseeEvent(Container.java:4492) 位于java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 位于java.awt.Container.dispatchEventImpl(Container.java:2273) 位于java.awt.Window.dispatchEventImpl(Window.java:2713) 位于java.awt.Component.dispatchEvent(Component.java:4687) 位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 在java.awt.EventQueue.access$000(EventQueue.java:101) 在java.awt.EventQueue$3.run(EventQueue.java:666) 在java.awt.EventQueue$3.run(EventQueue.java:664) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 在java.awt.EventQueue$4.run(EventQueue.java:680) 在java.awt.EventQueue$4.run(EventQueue.java:678) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 位于java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:128) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:117) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
我将
validateTree()
更改为
validate()
,并大吃一惊一切都很好,但我不知道这个更改是否也适用于Java6.x(我想不会)。如何将此代码更改为在Java6x和7x中工作

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

System.getProperty("java.version");
只需检查它是6还是7,并根据这一点做一些不同的操作。

这不是一个bug,而是java 7的一个特性;)

应在按住treeLock键的同时调用此函数

这是为了迫使你写:

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

对于@vince的回答,我认为看看该方法的结论是很有启发性的:

受保护的void validateTree()

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

(重点加上。)

我读这篇文章的方式是,该方法被设计为由
validate()
调用,它(大概)将持有树锁

注意,Java 6和Java 7中的文本是相同的。规格没有改变

现在显然有应用程序代码直接调用
validateTree()
。。。没有获得树锁。据推测,当最终用户点击过快或其他什么东西时,这会导致无法重现的问题(海森堡)。据推测,Java 7中的更改旨在引起开发人员对
validateTree()
的这种错误/错误的使用

好的,这是短期的疼痛。但从长远来看,每个人都会赢(除了律师:-):

  • Oracle不会因为奇怪的不可生产的行为而收到错误报告,这实际上是应用程序程序员的问题

  • 开发人员不会因为奇怪的不可生产的行为而收到客户的bug报告

  • 最终用户得到的应用程序工作得更好


什么代码?我知道这很旧,但这对我很有帮助,我喜欢加上我的两分钱
validateTree
受保护,因此您应该调用
validate
(它执行同步步骤)。另外,在Java 7中,他们在
validateTree
上添加了对
checkTreeLock()
的调用,这就是为什么当我假设客户机将Java更新为1.7时,我的一个旧程序停止工作时,出现了错误。这解决了问题:)在我的情况下,我