[英]Why does QuickTime QTSession.open fail when packaged using OSX Jar Bundler?
[英]When creating a custom Toolkit, why does createFrame fail on OSX?
我們正在嘗試擴展UISpec4j測試框架以在運行測試時顯示用戶界面。 因此,我們有一個自定義工具包,該工具包包裝了相關平台的本機工具包。 我們設法在Windows XP上使一切正常運行,但是在OSX上測試更改時,我們的createFrame擴展似乎表現得很奇怪:
public FramePeer createFrame(Frame target) {
FramePeer resultc = new UISpecFramePeer(target);
//super.createFrame(target);
return resultc;
}
從本質上講,我們想創建一個UISpecFramePeer作為攔截類...,以便UISpec4j可以詢問UI中發生的事情。 但是在我們的更改中,我們還希望顯示UI。 因此,我們嘗試通過使用本機工具包創建框架並將其包裝在UISpecFramePeer中(上面的代碼未顯示)來進行嘗試。
當我們運行上面的代碼時,測試將運行(正如我們期望的那樣),但是顯然沒有顯示任何內容。 但是,當我們包含super.createFrame(target)時。 我們得到以下異常:
SEVERE: Application class org.openshapa.OpenSHAPA failed to launch
java.lang.ClassCastException: org.uispec4j.interception.toolkit.UISpecFramePeer
at apple.awt.CWindow$8.convertJComponentToTarget(CWindow.java:236)
at apple.awt.CWindow$8.convertJComponentToTarget(CWindow.java:233)
at apple.awt.ClientPropertyApplicator.attachAndApplyClientProperties(ClientPropertyApplicator.java:24)
at apple.awt.CWindow$1.propertyChange(CWindow.java:190)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:341)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:270)
at java.awt.Component.firePropertyChange(Component.java:7277)
at javax.swing.JComponent.addNotify(JComponent.java:4479)
at javax.swing.JRootPane.addNotify(JRootPane.java:680)
at java.awt.Container.addNotify(Container.java:2544)
at java.awt.Window.addNotify(Window.java:467)
at java.awt.Frame.addNotify(Frame.java:501)
at java.awt.Window.pack(Window.java:485)
at org.jdesktop.application.SingleFrameApplication.initRootPaneContainer(SingleFrameApplication.java:216)
at org.jdesktop.application.SingleFrameApplication.show(SingleFrameApplication.java:463)
at org.openshapa.OpenSHAPA.startup(OpenSHAPA.java:444)
at org.jdesktop.application.Application$1.run(Application.java:171)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Exception in thread "AWT-EventQueue-2" java.lang.Error: Application class org.openshapa.OpenSHAPA failed to launch
at org.jdesktop.application.Application$1.run(Application.java:177)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.lang.ClassCastException: org.uispec4j.interception.toolkit.UISpecFramePeer
at apple.awt.CWindow$8.convertJComponentToTarget(CWindow.java:236)
at apple.awt.CWindow$8.convertJComponentToTarget(CWindow.java:233)
at apple.awt.ClientPropertyApplicator.attachAndApplyClientProperties(ClientPropertyApplicator.java:24)
at apple.awt.CWindow$1.propertyChange(CWindow.java:190)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:333)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:341)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:270)
at java.awt.Component.firePropertyChange(Component.java:7277)
at javax.swing.JComponent.addNotify(JComponent.java:4479)
at javax.swing.JRootPane.addNotify(JRootPane.java:680)
at java.awt.Container.addNotify(Container.java:2544)
at java.awt.Window.addNotify(Window.java:467)
at java.awt.Frame.addNotify(Frame.java:501)
at java.awt.Window.pack(Window.java:485)
at org.jdesktop.application.SingleFrameApplication.initRootPaneContainer(SingleFrameApplication.java:216)
at org.jdesktop.application.SingleFrameApplication.show(SingleFrameApplication.java:463)
at org.openshapa.OpenSHAPA.startup(OpenSHAPA.java:444)
at org.jdesktop.application.Application$1.run(Application.java:171)
... 7 more
為什么簡單地使用本機工具包創建框架(但不返回框架)會產生異常,而在對super.createFrame進行注釋時,框架會像正常情況一樣工作?
我沒有在OSX上工作,但同樣的問題也會在Windows上發生,原因是:
當您執行super.createFrame()
,實際上是在創建本機對等體,該對等體最終試圖顯示,因此調用了addNotify方法。 現在內部有很多直接將對等方轉換為WFramePeer的方法(在Windows中,OSX可能是CWindowPeer
或其他任何方法),因此是ClassCastException。 就您而言,我的猜測是,類CWindow試圖將您的UISpecFramePeer to WFramePeer(or CFramePeer or whatever)
。 只需通過反編譯檢查CWindow代碼並檢查即可。 請不要忘記發表您的發現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.