【问题标题】:java.awt.HeadlessExceptionjava.awt.HeadlessException
【发布时间】:2013-03-27 12:12:35
【问题描述】:
JFileChooser chooser = new JFileChooser();
JDialog dialog=new JDialog();
dialog.setAlwaysOnTop(true);
/*System.out.println("is always on top?"+dialog.isAlwaysOnTop());*/
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showOpenDialog(dialog);

String path = null;

if(returnVal == JFileChooser.APPROVE_OPTION) {

    path=chooser.getSelectedFile().getAbsolutePath();

}

我已经在 Servlet 的 doGet 方法中编写了这段代码。当我部署在 linux 服务器中时出现以下异常:

java.awt.HeadlessException
    at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)

有人知道如何克服吗?

【问题讨论】:

  • 您预计会发生什么? servlet 容器没有图形用户界面,它应该如何显示JFileChooser
  • 当 doGet 执行时,必须出现一个弹出窗口(JDialog)来选择目录,然后我正在检索字符串中选择的目录。清楚吗?但它在 JDialog dialog=new JDialog(); 处给出了 Headless 异常。
  • 由于 servlet 容器没有图形用户界面,它无法显示JDialog。它通过抛出HeadlessException 告诉你。 servlet 通常只处理一个 HTTP 请求,它依赖于服务器端的任何用户干预。阅读 Wikipediathis article 了解有关 servlet 工作原理的更多信息。
  • 那有什么解决办法呢?我可以使用 javascript 获取目录路径(由用户选择)吗?
  • 在尝试在服务器上运行基于 GUI 的应用程序 docs.oracle.com/javase/6/docs/api/java/awt/…

标签: java


【解决方案1】:

HeadlessException

在不支持键盘、显示器或鼠标的环境中调用依赖于键盘、显示器或鼠标的代码时引发。

【讨论】:

    【解决方案2】:

    你的 HTML 表单应该是这样的:

    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" />
    </form>
    

    然后,使用Apache Commons FileUpload,您可以在您的Servlet 中处理上传的文件。请参阅他们的User GuideFAQ 了解更多信息。

    【讨论】:

    • 我只需要生成一个弹出窗口来选择文件夹路径,并且需要将该路径存储在字符串中。你能帮忙怎么做吗?
    • 这无法在您的 Web 应用程序的服务器端实现。呈现由您的 Web 应用程序发送的 HTML 内容的浏览器将自动为您处理它。你读过the two links I supplied earlier吗?
    • 简单的回答:你不能让你的servlet生成一个弹出窗口。这是因为 servlet 在没有图形用户界面的环境中运行(如前所述)。 servlet 处理传入的 HTTP 请求,如果这些请求包含文件上传,您可以处理它。再一次,servlet 本身无法生成弹出窗口。
    • 这很清楚,但是,您试图在错误的位置对弹出窗口进行编程。这是浏览器负责的事情,而不是服务器。在将文件上传到 servlet 时读取 this tutorial
    • 你想要完成什么,Shiva?用户选择的路径(在客户端机器上)在服务器上是无用的。 servlet 应该用它做什么?
    【解决方案3】:

    在 Fedora 和其他一些 Linux 发行版中,默认情况下只安装无头 Java 运行时。您可能需要安装完整的 java 运行时:

    sudo yum install java-1.8.0-openjdk

    来源:https://github.com/chatty/chatty/issues/261#issuecomment-392228006

    【讨论】:

      【解决方案4】:

      Web 应用程序通常在无头的后端服务器上运行。除了在 Applet 中运行的 GUI 之外,最好避免使用任何 GUI。

      【讨论】:

      • 那有什么解决办法呢?我可以使用 javascript 获取目录路径(由用户选择)吗?
      • 如果不使用带有输入类型文件的表单上传,则使用小程序弹出并选择要上传的文件
      【解决方案5】:

      如果你在低权限的 Linux 下运行它,你会得到:

      java.lang.RuntimeException: Failed to create component for 'frame' reason: java.awt.HeadlessException
          at Pp$_run_closure1.doCall(Pp2.groovy:17)
          at Pp.run(Pp2.groovy:15)
          at Pp$run.call(Unknown Source)
          at Pp.main(Pp2.groovy:12)
      Caused by: java.awt.HeadlessException
      

      您必须以正确的权限运行它。

      首先尝试使用最大权限:

      sudo groovy MyClass.groovy
      

      这应该可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-16
        • 2019-05-22
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 2018-04-10
        相关资源
        最近更新 更多