我在连接到 X11 和 DISPLAY 变量时遇到问题
我在我的 raspberri pi 零中使用一个使用 JFrame 的 java 文件,我希望 JFrame 创建的窗口显示在连接到我的树莓派的监视器中,但我一直收到此异常。有任何想法吗?我正在使用 java openjdk 版本“1.8.0_312”
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
at java.awt.Window.initGC(Window.java:475)
at java.awt.Window.init(Window.java:495)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at javax.swing.JFrame.<init>(JFrame.java:233)
at Prueba.main(Prueba.java:5)
根据 DISPLAY 的 localhost:10.0 值,您似乎正在通过 SSH 连接到树莓派,并且您的 SSH 客户端正在尝试进行 X 转发(允许远程程序在本地计算机上打开窗口)。在您的 SSH 客户端中禁用 X 转发或将您的 DISPLAY 变量设置为其他值来避免这种情况。我会尝试
export DISPLAY=:0
作为测试的起点。
如果这没有帮助,请尝试运行一个已知的 X 应用程序,例如
xterm
,看看它是否会连接到 X 服务器并创建一个窗口。如果失败,您可能需要修复 X 服务器配置,或者 X 服务器可能没有运行。
如果成功,请检查适用于其他程序的 DISPLAY 变量 (
echo $DISPLAY
) 并尝试使用那里设置的任何值。 (例如export DISPLAY=:0
)
请注意,X 显示号通常对应于 X 服务器正在侦听的 TCP 端口号。 display number比端口号少6000,所以display 0监听6000端口,display 10监听6010。这意味着你可以使用像
netstat -tlp
这样的命令来列出正在监听特定端口的程序并检查是否有正在侦听端口 6010,对应于 DISPLAY 变量中的 localhost:10.0。如果在 6010 上侦听的进程是 ssh,则您的客户端正在尝试提供 X 转发。
还要注意,在大多数系统上,X 服务器都有一种身份验证机制,可以防止未启动会话的用户进行连接。 (查看 XAuthority 文件了解更多信息)通常 root 用户可以在任何 X 服务器上打开窗口,因此可能值得尝试以 root 用户身份进行测试。