您好我正在开展一个小组项目并且代码适用于我的队友PC,但我一直在遇到MacOS特定的错误。而这次我似乎陷入困境(不容易谷歌回答)。
在a previous post我发现我需要" -Djava.awt.headless=true
"作为VM设置以正确运行我的模拟。现在当我尝试在一些JFrame中产生时,他们都遇到了一个可爱的" java.awt.HeadlessException
"由于VM标志而异常。
我希望能够在我的MacBook上生成这些JFrame。
我需要-Djava.awt.headless
同时为true和false,以便我的程序在Mac上正常运行。如果我理解我的问题,那意味着我手上有一个大问题。
-Djava.awt.headless
。答案 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