尝试在 java 中创建 AWT 窗口时出现异常

Posted

技术标签:

【中文标题】尝试在 java 中创建 AWT 窗口时出现异常【英文标题】:Exception when trying to create an AWT window in java 【发布时间】:2017-06-01 14:11:11 【问题描述】:

所以最近想学习AWT,借了一本书,上面有如下代码:

/*Listing2301.java*/

import java.awt.*;

class Listing2301
        public static void main(String[] args)
                Frame wnd = new Frame("Einfaches Fenster");

                wnd.setSize(400,300);
                wnd.setVisible(true);
        

这段代码可以编译。根据这本书,这段代码应该生成一个没有任何功能的空窗口,但是当我尝试执行它时会引发异常:

线程“main”中的异常 java.awt.HeadlessException: No X11 DISPLAY 变量被设置了,但是这个程序执行了一个操作 需要它。 在 java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207) 在 java.awt.Window.(Window.java:535) 在 java.awt.Frame.(Frame.java:420) 在Listing2301.main(Listing2301.java:7)

我正在使用安装在我的 Windows 10 PC 上的 ubuntu bash 中的 vi 编辑器。

我的编程教授建议在 bash 中输入 export DISPLAY=:0.0。 编译代码并再次执行后,错误信息变为:

线程“主”java.lang.InternalError 中的异常:无法连接到 X11 窗口服务器使用 ':0.0' 作为 DISPLAY 变量的值。 在 sun.awt.X11GraphicsEnvironment.initDisplay(本机方法) 在 sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65) 在 sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110) 在 java.security.AccessController.doPrivileged(本机方法) 在 sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:74) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:195) 在 java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102) 在 java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81) 在 java.awt.Window.initGC(Window.java:467) 在 java.awt.Window.init(Window.java:487) 在 java.awt.Window.(Window.java:536) 在 java.awt.Frame.(Frame.java:420) 在Listing2301.main(Listing2301.java:7)

如何获得那个空的 AWT 窗口?代码错了吗?还是我需要以不同的方式配置 bash?

【问题讨论】:

说真的,你为什么要学习AWT?它已经被认为已经过时了 20 年了。 我听说它可以更容易地介绍挥杆。我发现的所有关于 Swing 的书都建立在 AWT 知识之上,而我没有。 我应该忽略 AWT 并直接跳入摇摆吗? 无论如何,您可能应该使用 Java 8 学习 JavaFX,而不是 Swing。但是如果你想学习Swing,它真的不需要AWT知识。试试Oracle Tutorial。 【参考方案1】:

Windows 10 的 Ubuntu 子系统基本上是同一台计算机内的独立操作系统。非常像虚拟机 - 它可以访问您的磁盘,但不能运行任何 Windows EXE 文件。

它运行的 Java 是 Linux Java。不是 Windows Java,它是一个 EXE 文件。因此,它无法访问 Windows GUI。它像通常在 Linux 机器上那样寻找在机器上运行的 X 服务器。但是这样的服务器通常不能在 Windows 机器上运行。

您应该在 Windows 下运行图形程序,而不是在 Ubuntu 子系统中。但是,非图形 Java 程序应该没有问题。

【讨论】:

我使用 javac 来编译和 java 来编译和运行我的代码。所以你是说这不应该工作? @Rismosch 很好,实际上javac 应该可以正常工作。但java 仅适用于 Windows 10 Ubuntu 子系统中的非 GUI 程序。 谢谢。我不知道。我刚刚在一个名为“Eclipse”的程序中尝试了代码,并且代码按预期工作。我的教授说学习像vi-editor这样的java编辑器比像Eclipse这样的程序要好。 @Rismosch 我是一名拥有 30 年经验的专业人士,我使用 Eclipse... 无论如何,vi 并不是 Linux 独有的。您可以在您的 Windows 上安装 vim 并根据需要使用它。不过,它并不是真正的 Java 编辑器。只是一个纯文本编辑器。 我相信你。我的教授刚刚说它不利于学习,因为它会自动向您显示错误并告诉您如何解决它们,而您却不理解它。他说 Eclipse 帮助你运行代码,而不是帮助你理解它。

以上是关于尝试在 java 中创建 AWT 窗口时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

在 Appdata 文件夹中创建文本文件时出现异常,它说文件正在被另一个进程使用

在 ADT Mac Bundle 中创建第一个 android 应用程序时出现 java.lang.NullPointerException

如何在 gwt 中创建时区对象?

尝试在 Kafka 中创建分区时出现 NoClassDefFoundError

在 Java 中创建列表列表时出现意外输出

尝试使用 npm start 命令启动服务器时出现异常