生成JFrame时抛出LWJGL java.awt.HeadlessException

时间:2017-10-29 22:49:33

标签: java macos awt lwjgl

您好我正在开展一个小组项目并且代码适用于我的队友PC,但我一直在遇到MacOS特定的错误。而这次我似乎陷入困境(不容易谷歌回答)。

a previous post我发现我需要" -Djava.awt.headless=true"作为VM设置以正确运行我的模拟。现在当我尝试在一些JFrame中产生时,他们都遇到了一个可爱的" java.awt.HeadlessException"由于VM标志而异常。

试图实现

我希望能够在我的MacBook上生成这些JFrame。

问题

我需要-Djava.awt.headless同时为true和false,以便我的程序在Mac上正常运行。如果我理解我的问题,那意味着我手上有一个大问题。

编辑:在我的Macbook上的VM中运行它允许我正确运行项目。这远非理想的解决方案。我仍然在寻找这个模糊问题的解决方案。

我尝试了什么

  • 未使用VM选项运行:出现previous post中描述的问题。因此,这不是一个可行的选择
  • 使用VM选项运行:这会在创建JFrame时抛出-Djava.awt.headless

1 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法可能是以不同的方式返回并解决原始问题。

您必须确保没有在主线程(GLFW线程)中初始化BufferedImage必须单独完成。从你原来的问题很难说,但这看起来像是原因的一部分。开始一个新线程来代替进行图像处理。

请参阅本答案底部的解决方案和建议以获取快速摘要,此处还可以查看其他遇到相同问题的人:Java Creating Instance of BufferedImage Freezes Program

快速说明你的代码在Windows而不是Mac上运行的原因:这是因为两个操作系统经常运行不同的openGL实现,而且Mac通常会落后并错过一堆可能解决像问题的更新/更改这个在初始化openGL线程上的BufferedImage时不会冻结。

如果上述方法不起作用,那么先来看看无头模式是什么。 (强调我的):

  

请参阅底部的链接以获取完整文章和更多信息。

     

无头模式是一种系统配置,其中显示设备,   键盘,或鼠标缺乏。听起来很意外,但实际上你可以   即使使用图形数据,也可以在此模式下执行不同的操作。

     

适用的地方?让我们说您的应用程序重复生成某个图像,例如图形授权代码   每次用户登录系统时都必须更改。什么时候   创建图像,您的应用程序既不需要显示也不需要   键盘。 现在让我们假设你有一台大型机或专用的   项目中没有显示设备,键盘或鼠标的服务器。   理想的决定是使用这种环境的实质计算   视觉和非视觉功能的力量。 图片   在无头模式系统中生成然后可以传递给   进一步渲染的有头系统。

所以什么时候应该使用无头模式:

  

在没有显示设备,键盘或鼠标的计算机上。

那不是你吗?但是,如果那是你(LWJGL?),那么让我们来看看如何使用无头模式:

  

然后可以在无头模式系统中生成图像   传递到令人满意的系统进一步渲染。

这意味着你应该有一个特殊的无头代码来完成你的无头图像,然后将图像传回一个普通的JFrame头部。

那么为什么它会失败:

  

如果显示设备,键盘或鼠标,许多组件都会受到影响   不受支持。一个合适的类构造函数抛出一个   HeadlessException的

     
      
  • 按钮
  •   
  • 复选框
  •   
  • 选择
  •   
  • 对话框
  •   
  • FileDialog的
  •   
  •   
  • 标签
  •   
  • 列表
  •   
  • 菜单
  •   
  • 的MenuBar
  •   
  • 菜单项
  •   
  • PopupMenu的
  •   
  • 滚动条
  •   
  • 的ScrollPane
  •   
  • 的TextArea
  •   
  • 的TextField
  •   
  • 窗口
  •   

问题的解决方案:

  

某些类(如Canvas或Panel)可以在无头模式下执行。

完美,所以我们只需要小心无头模式中使用的内容。您询问了如何使用和不使用无头模式,而不是使用-Djava.awt.headless you can do it programmatically within your code在需要时使用System.setProperty("java.awt.headless", "true");全局设置无头模式。 JFrame应该是正常的(不是无头),但是你可以在没有问题的情况下产生JPanel无头。

我建议:

你创建一个普通的主线程没有VM选项产生JFrames,然后使用该主线程产生一个新的子线程并将该线程中的LWJGL位设置为无头,这样你就可以运行你的LWJGL代码没有问题,同时你仍然可以从你的主线程中获得JFrame。请记住确保未在主LWJGL / OpenGL线程中完成缓冲图像。

无头信息来源: http://www.oracle.com/technetwork/articles/javase/headless-136834.html