0

(編集: 問題は解決しました - 詳細は最後を参照してください)

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 行を投稿するという余分な手順を実行する必要があったため、エラーが明らかになった可能性があります。)

4

3 に答える 3

0

答え使用WindowAdapterしようとしているクラスは にありjava.awt.eventますが、そのパッケージをインポートしていません。編集: これで問題が解決したようには見えませんが (コメントを参照)、以下の裏話が残っています。

バックストーリーあなたのマニフェストは手作りのように見えますが、そうしないことをお勧めします (間違いを犯すでしょうし、マニフェストをうまく同期させるのは面倒です)。Eclipse を使用している場合はbndtoolsを、その他の環境では単純なbndを参照してください。

于 2012-05-15T21:50:48.003 に答える
0

私のコードはopenImpl、EDT で呼び出される前に OSGi フレームワークを停止しました。

WithoutinvokeLater openImplはすぐに呼び出され、他のコードが OSGi フレームワークをシャットダウンする前に呼び出されます。へのinvokeLater呼び出しがopenImpl後でスケジュールされ、その「後で」が発生する前に、私のコードは OSGi フレームワークをシャットダウンします。

その場合、Apache Felix フレームワークはBundleWiringImplインスタンス (スタック トレースを参照) を破棄済みとしてマークしました。myopenImplが EDT で呼び出されると、破棄済みとしてマークされているため、BundleWiringImpl.getClassLoader返されます。null最終的に、これは NPE につながります。

于 2012-11-10T22:51:31.750 に答える
-1

スタック トレースには、いくつかのセキュリティ チェック「ProtectionDomain,..doIntersectionPrivilege」が含まれています。SecurityManager を無効にしようとしましたか。次の VM オプションを使用して無効にすることができます。

-Djava.security.manager=

こちらもご覧ください: Javaセキュリティマネージャを無効にする方法?

于 2012-05-16T12:09:01.640 に答える