[英]validateTree in Java 7.x doesnt work (in Java 6.x was fine)
我的java版本是:
Java Plug-in 10.3.1.255使用JRE版本1.7.0_03-b05 Java HotSpot(TM)客戶端VM
所以當我有版本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)
我將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,並根據具體情況做一些不同的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.