繁体   English   中英

制作 JFrame 时抛出 LWJGL java.awt.HeadlessException

[英]LWJGL java.awt.HeadlessException thrown when making a JFrame

嗨,我正在处理一个小组项目,代码在我队友的 PC 上工作,但我一直遇到 MacOS 特定的错误。 这一次我似乎被卡住了(没有简单的谷歌答案)。

在上一篇文章中,我发现我需要“ -Djava.awt.headless=true ”作为虚拟机设置才能正确运行我的模拟。 现在,当我尝试在某些 JFrame 中生成时,由于该 VM 标志,它们都遇到了一个可爱的“ java.awt.HeadlessException ”异常。

努力实现

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

问题

我需要-Djava.awt.headless同时为真和假,以便我的程序在 Mac 上正常运行。 如果我正确理解我的问题,则意味着我手头有大问题。

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

我试过的

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

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

您必须确保没有在主线程(GLFW 线程)中初始化BufferedImage ,它必须单独完成。 很难从您最初的问题中看出,但这似乎是原因的一部分。 启动一个新线程来进行图像处理。

请参阅此答案底部的我的解决方案和建议以获取快速摘要,也可以在此处查看其他遇到相同问题的人: Java 创建 BufferedImage 实例冻结程序


关于为什么您的代码适用于 Windows 而不是 Mac 的快速说明:这是因为两个操作系统通常运行不同的 openGL 实现,通常 Mac 可能会落后并错过一系列可能解决此类问题的更新/更改,所以在 openGL 线程上初始化BufferedImage时它不会冻结。


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

有关完整文章和更多信息,请参阅底部的链接。

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

适用于何处? 假设您的应用程序重复生成某个图像,例如,每次用户登录系统时都必须更改的图形授权码。 创建图像时,您的应用程序既不需要显示器也不需要键盘。 现在让我们假设您的项目中有一台没有显示设备、键盘或鼠标的大型机或专用服务器。 理想的决定是将此环境的大量计算能力用于视觉和非视觉特征。 在无头模式系统中生成的图像然后可以传递到有头系统进行进一步渲染。

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

在没有显示设备、键盘或鼠标的机器上。

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

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

这意味着您应该有一段特殊的无头代码来处理您的无头图像内容,然后将图像传递回带有头部的普通 JFrame。

那么为什么它对你来说失败了:

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

  • 按钮
  • 复选框
  • 选择
  • 对话
  • 文件对话框
  • 框架
  • 标签
  • 列表
  • 菜单
  • 菜单栏
  • 菜单项
  • 弹出菜单
  • 滚动条
  • 滚动窗格
  • 文本区域
  • 文本域
  • 窗户

问题的解决方法:

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

完美,所以我们只需要注意无头模式中使用的内容。 您询问如何使用和不使用无头模式,而不是使用 VM 选项-Djava.awt.headless全局设置无头模式, 您可以使用System.setProperty("java.awt.headless", "true"); 需要的地方。 JFrame应该是正常的(不是 Headless),但是您可以毫无问题地将JPanel成为 Headless。

我建议:

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM