2010-07-26 85 views
1

我试图打开Servlet的一个对话框&它打开罚款。 但后来我试图在我的线程的运行方法中实现同样的事情。 它gaved我以下错误:如何避免线程中的HeadlessException?

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"); 
} 

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

+3

你为什么要在servlet中打开一个本地对话框......? – 2010-07-26 14:11:36

+0

重新格式化的代码;如果不正确请回复。 – trashgod 2010-07-26 14:35:32

+0

实际上试图在线程完成时显示确认。 所以试图通过上面的想法来显示它,但我想在客户端。 – 2010-07-27 07:28:03

回答

1

Java servlet代码在web服务器上运行,而不是在webclient(webbrowser)上运行。所有的网络服务器都在监听HTTP请求,生成HTML/CSS/JS响应并将其发送到Web客户端。所有的Web客户端都会发送HTTP请求并处理检索到的HTML/CSS/JS响应。

如果您在servlet中执行Swing GUI,它将显示在Web服务器中,而不是Web客户端中。

基本上有这个特定问题的解决方案3:在Web客户端,而不是

  1. 运行的Swing GUI代码。您可以通过由JSP/HTML页面提供的AppletWeb Start来实现。

  2. 改为使用客户端编程/脚本语言,例如JavaScript或ActionScript(Flash)。在JavaScript中有一个alert()函数,它显示一个对话框。

  3. 在JSP中使用像JSTL <c:if>和/或EL这样的taglib来有条件地呈现HTML/CSS/JS内容。最终可以与解决方案#2结合使用。

+0

它是真的,但我有多个线程在服务器端运行,所以当特定线程完成其任务时如何在客户端的同一页中显示对话框。 – 2010-07-28 09:31:25

+0

我已经回答了。我认为选项2与Ajax结合是最好的。 – BalusC 2010-07-28 11:12:24

3

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

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

在您的Web服务器上,您要求网页生成器(servlet)打开一个对话框。这会产生以下几个问题:

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

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

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

+1

参见http://java.sun.com/developer/technicalArticles/J2SE/Desktop/headless/ – trashgod 2010-07-26 14:36:21

+0

感谢您的链接。在这种情况下,正确的解决方案是使用日志记录,但是我猜如果你习惯于弹出对话框,当它不可用时它可能会令人惊讶。 – 2010-08-09 14:37:31