【问题标题】:Java: Can't connect to X11 window server using 'localhost:1.0' as the value of the DISPLAY variableJava:无法使用 'localhost:1.0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器
【发布时间】:2014-09-17 16:42:28
【问题描述】:

我创建了一个 Web 应用程序,它利用 JOptionPane 向用户显示一些对话框,例如“找不到记录等”。我在 Windows 中进行了这项开发,一切正常。

然后我被要求在远程服务器上部署项目战争,这是一台没有任何 GUI 的 RHEL 机器(类似于 AWS 机器)。当我在那里运行我的应用程序时,只要有 JOptionPane 语句,就会出现下面提到的异常。

线程 "http-bio-8080-exec-6" java.lang.InternalError 中的异常:无法使用 'localhost:1.0' 作为 DISPLAY 变量的值连接到 X11 窗口服务器。 在 sun.awt.X11GraphicsEnvironment.initDisplay(本机方法) 在 sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:62) 在 sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:178) 在 java.security.AccessController.doPrivileged(本机方法) 在 sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:142) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:188) 在 java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82) 在 sun.swing.SwingUtilities2.isLocalDisplay(SwingUtilities2.java:1393) 在 javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1563) 在 javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:147) 在 javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1599) 在 javax.swing.UIManager.setLookAndFeel(UIManager.java:530) 在 javax.swing.UIManager.setLookAndFeel(UIManager.java:570) 在 javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1320) 在 javax.swing.UIManager.initialize(UIManager.java:1407) 在 javax.swing.UIManager.maybeInitialize(UIManager.java:1395) 在 javax.swing.UIManager.getDefaults(UIManager.java:644) 在 javax.swing.UIManager.getString(UIManager.java:790) 在 javax.swing.UIManager.getString(UIManager.java:807) 在 javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:610)

我已经试过用export DISPLAY也试过了

System.setProperty("java.awt.headless", "true");
    boolean headless = GraphicsEnvironment.isHeadless();

但我的问题仍未解决?有输入吗?我不应该在 Web 应用程序中使用 JOptionPane 吗?如果不是那么什么是更好的选择? JOption 的替代品?

【问题讨论】:

  • 我认为 webapp 向用户提供的任何反馈都是基于 web 的(jsp、jsf 等)
  • 如果这是一个 Web 应用程序,通过浏览器访问,那么任何使用显示的尝试都将发生在服务器上。您不能在客户端远程显示 Java GUI,除非客户端运行了 X 服务器并且 Web 服务器可以启动到客户端的 X 连接。这是一个非常非典型的设置,在一般情况下不起作用。您需要提供更详细的说明来说明您要达到的目标。
  • 我有一个 jsp 页面,它接受用户的输入(型号)...jsp 页面然后调用 servlet...然后调用一个 java 方法,该方法在打开数据库连接后进行检查型号是否存在......如果不存在,则显示 JOptionPane 窗口(显示:“型号不存在”)并将用户重定向到输入型号的页面......如果型号存在,则重定向到包含型号详细信息的页面...我希望这能说明我为什么使用 JOptionPane
  • @Jim Garrison....你能建议一个替代品来代替 JOptionPane 吗? ...其余代码在 linux 机器上运行良好,我现在已经明白这可能不是一个简单的解决方案....仍然想尝试一下...欢迎所有建议。
  • 基本架构存在根本缺陷。服务器和客户端之间的所有流量都应该通过 HTTP 连接,并且您正在尝试建立从服务器返回客户端的第二个通道。如果 1) 客户端没有运行 X 服务器,则会中断; 2) 客户端的防火墙未配置为允许 X 流量进入。无论如何,使用localhost 将永远不会起作用。当服务器和客户端不是同一台机器时,localhost 指的是 SERVER。

标签: java linux joptionpane


【解决方案1】:

您绝对不能在 Web 应用程序中使用 JOptionPane。甚至不要考虑在 Swing 中使用任何其他 JWhatever 类。

JOptionPane 和其他各种 Swing 组件仅出现在它们正在运行的机器上。因此,即使您可以克服遇到的异常并以某种方式显示 JOptionPane,JOptionPane 也会出现在服务器1 上。 它不会出现在用户的浏览器中,所以用户不会看到它。

所以,假设这个 JOptionPane 已经出现在服务器上。用户应该如何阅读或关闭它?他们只能访问他们的浏览器。

简单的答案是他们不能。

更糟糕的是,JOptionPanes 是模态的,因为创建它们的调用在对话框关闭之前不会返回。如果用户输入了一个不存在的型号,您的 Web 应用程序似乎会挂起,因为它无法完成页面服务,直到 JOptionPane 被关闭。随着越来越多的用户使用您的系统,整个应用程序最终将停止运行,因为越来越多的 Web 应用程序的工作线程卡住等待 JOptionPanes 被解除。

相反,您需要以某种方式将错误消息发送回浏览器。

如果用户输入的型号不存在,我建议重定向回输入型号的页面,并在此页面上显示一条消息,让用户清楚他们被重定向回来,因为他们输入了一个不存在的型号。

您的代码可能在您的机器上为您工作,但这只是因为您在运行 Web 服务器的同一台机器上浏览您的 Web 应用程序。

1:从技术上讲,如果您在客户端机器上有一个 X 服务器,并且可以按照 Jim Garrison 的描述进行设置,那么您可以向客户端显示此 JOptionPane,但这肯定不是您可以做到的假设。

【讨论】:

  • 在做了更多的研究之后......我现在明白你和@JimGarrison 所说的有道理......我已经开始努力改变这种 JOptionPane 方法......感谢您的回复
猜你喜欢
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2011-09-29
  • 1970-01-01
  • 2015-07-05
相关资源
最近更新 更多