(編集: 問題は解決しました - 詳細は最後を参照してください)
OSGi Bundle でSwingJFrame
を作成したいと考えています。WindowAdapter
を使用してこれを行うSwingUtilities.invokeLater
と、WindowAdapter
クラスが見つかりません。それがなくinvokeLater
ても動作します。
WindowAdapter
を使用するときに見つかるようにするには、どうすればよいinvokeLater
ですか? OSGi 環境ではinvokeLater
不適切ですか?
詳細:
カスタム ランチャーで Apache Felix フレームワーク インスタンスを起動し、バンドルをインストールして起動します。私のバンドルの開始方法は次のようになります。
public void start(BundleContext arg0) throws Exception {
myFrame = new MyFrame();
myFrame.open();
}
これは MyFrame クラスです。
public class MyFrame {
JFrame mainFrame;
public void open() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
openImpl();
}
});
// If called like this it works:
// openImpl();
}
public void openImpl() {
mainFrame = new JFrame("Title");
mainFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
WindowAdapter wa = new WindowAdapter() {
};
mainFrame.addWindowListener(wa);
mainFrame.setSize(800, 600);
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
}
}
これはバンドルの私のマニフェストです:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.7.0_03-b05 (Oracle Corporation)
Built-By: Rainer Schwarze
Bundle-Name: DummyBdl
Bundle-Description: Dummy Bundle
Bundle-Vendor: admaDIC
Bundle-Version: 0.0.1
Bundle-Activator: dummybdl.Activator
Import-Package: org.osgi.framework, javax.swing
Export-Package: dummybdl.api
Export-Service: dummybdl.Provider
そして、これは私が得るスタックトレースです:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1432)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at dummybdl.MyFrame.openImpl(MyFrame.java:24)
at dummybdl.MyFrame$1.run(MyFrame.java:16)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
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.awt.EventQueue.dispatchEvent(EventQueue.java:675)
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)
OSGi の初心者である私は、それを修正するためにいくつかのことを試みましたが、これまでのところ解決策を見つけることができませんでした。それでは、StackOverflow で最初の質問をしてみませんか :-)
編集:
30 分間のデバッグの後、問題は完全に私のものであることが判明しました。私のコードはopenImpl
、EDT で呼び出される前に OSGi フレームワークを停止しました。
そのため、Apache Felix フレームワークはBundleWiringImpl
インスタンス (スタック トレースを参照) を破棄済みとしてマークしました。myopenImpl
が EDT で呼び出されると、破棄済みとしてマークされているため、BundleWiringImpl.getClassLoader
返されます。null
最終的に、これは NPE につながります。(Felix ローダーの 50 行を投稿するという余分な手順を実行する必要があったため、エラーが明らかになった可能性があります。)