java - 如何避免线程中出现 HeadlessException?

标签 java swing servlets multithreading awt

我尝试在 Servlet 中打开一个对话框,它打开得很好。 但后来我试图在我的线程的运行方法中实现同样的事情。 它给了我以下错误:

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:159)
at java.awt.Window.<init>(Window.java:431)
at java.awt.Frame.<init>(Frame.java:403)

下面是我的代码:

JFrame frame = new JFrame("Success Message");
frame.setSize(200, 50);
frame.add(new JLabel("Data uploaded from "+inputFile.getFilename()));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

我也试过下面的代码,但是失败了

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
if(!ge.isHeadless()){ 
    System.setProperty("java.awt.headless", "true");
}

异常描述为: 在不支持键盘、显示器或鼠标的环境中调用依赖于键盘、显示器或鼠标的代码时抛出。

最佳答案

有些代码最终需要接触显卡,或者至少是 Java 中的工作图形子系统。如果您在未启用图形的系统上运行此代码,则会抛出 HeadlessException。

您正在 Servlet 中运行您的代码,这是一段通常返回网页的代码。由于网页是一个包含所有适当标签的大字符串,因此网页不需要图形环境。该字符串由网络浏览器接收,网络浏览器通常有一个图形环境来显示结果。

在您的网络服务器上,您要求网页生成器(servlet)打开一个对话框。由于多种原因,这会产生问题:

  1. 对话框将显示在网络服务器上,而不是网络客户端上。
  2. Web服务器只有一个屏幕,会根据浏览网页的人弹出对话框。
  3. 由于服务器可能同时处理许多客户端,因此服务器被调整为为每个客户端使用最少的资源。
  4. 由于服务器仅将项目返回到网络浏览器,因此服务器不需要图形环境。

所有这些点结合在一起意味着 servlet 不会被配置为可以访问图形环境,并且不会有机会显示弹出对话框;因为,没有可用于显示对话框的图形环境。

通常,您不能将 swing/awt 代码与 servlet 混合使用;然而,在 swing 和 awt 中都有一个图形操作的子集,它允许在不需要图形环境的情况下进行图像处理。这是为了简化在文件处理环境中转换和构建图像的开发,程序永远不会显示图像。以 .png 到 .jpg 转换器为例,假设它从不显示图像,程序可以打开图像并完成它的工作,并在不需要图形卡的情况下关闭图像。

关于java - 如何避免线程中出现 HeadlessException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3335582/

相关文章:

用于匹配大括号的 Java 正则表达式 - "invalid escape sequence"

java - 如何使用其路径显示图像

java - 在paintComponent()中调用repaint()使用了太多CPU

mysql - JSP 和 Servlet 的 CRUD 应用程序的 doPost() 或 doGet() 方法?

servlets - jboss部署问题-无法访问servlet

java - tomcat启动时如何启动一个新线程

java - 如果条件可以为真或为假,为什么有必要

Java使用instanceof和迭代器

java - 在 CDI SessionScoped bean 中注入(inject) HttpServletRequest

java - 如何将应用程序添加到系统托盘