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(Native Method) 在 sun.awt.SunToolkit.targetToAppContext(Unknown Source) 在 sun.awt.windows.WComponentPeer.postEvent(Unknown Source) 在 sun.awt.windows.WComponentPeer.postPaintIfNecessary(Unknown源) 在 sun.awt.windows.WComponentPeer.handlePaint(Unknown Source) 在 sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget(Unknown Source) 在 sun.java2d.d3d.D3DScreenUpdateManager.createScreenSurface(Unknown Source) 在 sun.awt.windows sun.awt.windows.WComponentPeer.replaceSurfaceData(Unknown Source) 处 sun.awt.windows.WComponentPeer 处的 .WComponentPeer.replaceSurfaceData(Unknown Source)。

我究竟做错了什么?

4

5 回答 5

3

从 3.3 版开始,SWT 会自动查找其所需的特定于平台的库,这些库位于 swt.jar 内(在 JAR 内容的顶层)。因此,您只需要类路径中的 swt.jar,它就可以工作。

获得 UnsatisifiedLinkError 的一种方法是,如果您将 swt.jar 用于另一个平台——它们都被命名为“swt.jar”;例如,如果您为 Linux 下载了一个,并尝试在 Windows 上使用它。该项目可以编译,因为所有 API 级别的代码对于每个平台都是相同的 Java,但是当您运行时它会失败,因为本机库是错误的。

但是,由于这种情况下的错误发生在 AWT 中,它可能是其他东西,与 SWT 没有直接关系。首先,确保您已经下载了 Windows SWT 版本。当您将它导入您的工作区时,它会创建一个名为 org.eclipse.swt 的 Eclipse 项目,其中包含 swt.jar。然后,您将 org.eclipse.swt 设置为您的项目所需的项目,并且构建路径中除了有效、干净的 JRE 之外没有其他任何内容(您可以尝试定义一个新的 [Window -> Preferences -> Java -> Installed JREs],或者只是使用您可能已安装的其他软件)。

您也可以从 shell/命令窗口对其进行测试。转到您的项目目录。该命令应该很简单:

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 设法搞砸了。

于 2009-08-23T09:48:36.360 回答
0

我已经解决了这个问题,我搜索了很长时间,但是在我检查了我的java版本后我找不到一个可以解决我的问题

我发现jdk和jre版本不同,例如

我在我的文件系统上发现了一个额外的文件

jdk 1.4 jre 1.4 jre 1.5(额外)

您应该删除新版本的 jre(jre1.5)

那么好吧,我的英语很差,希望我的留言能帮到你,如果你有什么问题,可以联系我,email:fish2-2@163.com

于 2009-09-20T09:20:35.167 回答