0

私は Eclipse の初心者で、混合 AWT/SWT アプリケーションを構築しようとしています。これが私のコードです:

public class HelloWorldSWT {

    public static void main(String[] args) {
        Frame frame = new Frame("My AWT Frame"); // java.awt.Frame
        frame.setLayout( new BorderLayout() );
        Canvas canvas = new Canvas(); // java.awt.Canvas
        frame.add(canvas, BorderLayout.CENTER);
        frame.setVisible(true);

        Display display = new Display(); // display object to manage SWT lifecycle.
        Shell swtShell = SWT_AWT.new_Shell(display, canvas);
        Button m_button = new Button(swtShell, SWT.PUSH);
        m_button.setText( "button" );

        // invoke the AWT frame rendering by making the frame visible
        // This starts the EDT
        frame.setVisible(true);

        // standard SWT dispatch loop
        while(!swtShell.isDisposed())
        {
            if(!display.readAndDispatch())
                display.sleep();
        }
        swtShell.dispose();
    }
}

これは正常にコンパイルされますが、Eclipse でアプリケーションとして実行すると、次のエラーが発生します。

スレッド「メイン」での例外 java.lang.UnsatisfiedLinkError: sun.awt.SunToolkit.getAppContext(Ljava/lang/Object;)Lsun/awt/AppContext; sun.awt.SunToolkit.getAppContext (ネイティブ メソッド) で sun.awt.SunToolkit.targetToAppContext (不明なソース) で sun.awt.windows.WComponentPeer.postEvent (不明なソース) で sun.awt.windows.WComponentPeer.postPaintIfNecessary (不明)ソース) sun.awt.windows.WComponentPeer.handlePaint (ソース不明) sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget (ソース不明) sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface (ソース不明) sun.awt.windows .WComponentPeer.replaceSurfaceData(未知のソース) at sun.awt.windows.WComponentPeer.replaceSurfaceData(未知のソース) at sun.awt.windows.WComponentPeer.

私は何を間違っていますか?

4

5 に答える 5

3

バージョン 3.3 以降、SWT は、swt.jar 内 (JAR コンテンツの最上位レベル) にある必要なプラットフォーム固有のライブラリを自動的に見つけます。したがって、必要なのはクラスパス内の swt.jar だけで、機能します。

UnsatisifiedLinkError を取得する 1 つの方法は、別のプラットフォームで swt.jar を使用している場合です。それらはすべて「swt.jar」という名前です。たとえば、Linux 用のものをダウンロードして、Windows で使用しようとするとします。すべての API レベルのコードはすべてのプラットフォームで同じ Java であるため、プロジェクトは正常にコンパイルされますが、ネイティブ ライブラリが間違っているため、実行すると失敗します。

ただし、この場合のエラーは AWT で発生しているため、SWT とは直接関係のない別の原因である可能性があります。まず、Windows SWT リリースをダウンロードしたことを確認します。これをワークスペースにインポートすると、swt.jar を含む org.eclipse.swt という名前の Eclipse プロジェクトが作成されます。次に、org.eclipse.swt をプロジェクトの必須プロジェクトにし、ビルド パスには有効でクリーンな JRE 以外は何も作成しません (新しい JRE を定義してみることができます [ウィンドウ -> 設定 -> Java -> インストール済みの JRE])。または、インストール済みの別のものを使用してください)。

シェル/コマンド ウィンドウからテストすることもできます。プロジェクト ディレクトリに移動します。コマンドは次のように単純にする必要があります。

java -cp bin;..\org.eclipse.swt\swt.jar HelloWorldSWT

コードを実行しました (Vista-32、JDK 6_15) が、ウィンドウが非常に小さく開き、閉じませんでした。私は SWT-AWT ブリッジについて何も知らないので、頑張ってください....

于 2009-08-07T18:59:17.053 に答える
1

UnsatisfiedLinkError は、アプリを実行しようとしたときに、依存しているネイティブ ライブラリが見つからないことを示しています。これを IDE でコンパイルする場合、ライブラリはビルド パスにあります。IDE からこれを実行してこのエラーが発生した場合、ライブラリは実行パスにありません。実行ダイアログをチェックして、ビルド パスにあるライブラリが実行パスにあることを確認します。

于 2009-08-07T04:06:17.187 に答える
1

前述のように、これは JVM がネイティブ ライブラリを見つけられないことを示しています。AWT/SWT を混在させているので、JVM が SWT ライブラリ (Windows の場合は .dll、Linux の場合は .so、Mac の場合は不明) を見つけられないと思います。私は、システム プロパティを使用して Java にどこを見るかを伝えることに部分的です。

-Djava.library.path=<absolute path to the .dll/.so that SWT needs>
于 2009-08-07T04:09:53.420 に答える
0

私はまったく同じ問題を抱えており、Java を完全に削除して再インストールすることによってのみ解決できました。どうやら、ネイティブ AWT メソッドを含む DLL の 1 つがうまくいかなかったようです。

于 2009-08-23T09:48:36.360 に答える
0

この問題は解決しました。この情報を長い間検索しましたが、Java のバージョンを確認した後、問題を解決する情報が見つかりません。

たとえば、jdkとjreのバージョンが異なることがわかりました

私のファイルシステムに 1 つの余分なドキュメントが見つかりました

jdk 1.4 jre 1.4 jre 1.5(追加)

新しいバージョンの jre(jre1.5) を削除する必要があります。

それでは、私の英語は下手です。私のメッセージが役に立てば幸いです。質問がある場合は、私に連絡してください。email:fish2-2@163.com

于 2009-09-20T09:20:35.167 に答える