问候,
我正在尝试在非屏幕设备中获取 JFrame 绘图。 JFrame 构造函数有一个
JFrame(GraphicsConfiguration)
看似允许这样做:
我的第一次尝试是创建我自己的 GraphicsConfiguration,当调用 getType() 时,GraphicsDevice 报告 GraphicsDevice.TYPE_IMAGE_BUFFER。
但是 JFrame.init 专门查找类型并在类型不是 TYPE_RASTER_SCREEN 时抛出异常:
if (graphicsConfig.getDevice().getType() !=
GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new IllegalArgumentException("not a screen device");
}
接下来,我尝试使我返回的 GraphicsDevice 报告 GraphicsDevice.TYPE_RASTER_SCREEN。这允许正确初始化 JFrame,但是当它去显示它时,我得到了
Exception in thread "main" java.lang.ClassCastException: TestGraphicsConfiguration cannot be cast to sun.awt.X11GraphicsConfig
因此,关于如何绘制未显示在屏幕上但布局和功能始终如一的 JFrame,我已经没有什么想法了。
这是在掉进兔子洞吗,还是可以这样做?
最佳答案
Java top-level container例如JFrame
需要访问 peer component原生于主机平台,通常通过 JNI。或者,您可以使用 BufferedImage
或 java.awt.headless
模式,如讨论 here .
附录:
I wonder if "any human" can replace how peers are selected.
我不知道如何替换特定的对等组件,但可以唤起特定于平台的 native 组件; Java Native Access (JNA)就是这样一种途径。作为一个极端的例子,这个 6502 JVM在以 1 MHz 运行的 8 位处理器上以 128K 运行。演示,包括 source对于右下角的屏幕截图,是使用 javac
编译的。
关于java - 在非光栅图形配置中显示 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599215/