Ollie Glass的解决方案不再起作用,因为构造函数PApplet/Applet
检查环境是否是无头的,即-Djava.awt.headless=true
.
所以一开始就没有办法创建 PApplet 对象。
相反,PGraphics
直接创建您的。例如,将所有内容绘制成 pdf
PGraphics pdf = new PGraphicsPDF();
pdf.setPrimary(false);
pdf.setPath(filename);
pdf.setSize(sizeX, sizeY);
// pdf.setParent(new PApplet()); This is intentionally NOT called.
pdf.beginDraw();
// draw everything
pdf.dispose();
pdf.endDraw();
添加文本仍然会引发异常,因为底层PGraphics
调用它的parent
(the PApplet
) 来获取一些帮助方法。但是,这还没有设置,因为我们一开始就不允许创建一个PApplet
。
摆脱这些函数调用的解决方案是创建您自己的PGraphicsPDF
. 例如
class MyPGraphicsPDF extends PGraphicsPDF{
@Override
public float textAscent() {
if (textFont == null) {
defaultFontOrDeath("textAscent");
}
Font font = (Font) textFont.getNative();
//if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
if (font != null) {
FontMetrics metrics = this.getFontMetrics(font);
return metrics.getAscent();
}
return super.textAscent();
}
@Override
public float textDescent() {
if (textFont == null) {
defaultFontOrDeath("textDescent");
}
Font font = (Font) textFont.getNative();
//if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
if (font != null) {
FontMetrics metrics = this.getFontMetrics(font);
return metrics.getDescent();
}
return super.textDescent();
}
public FontMetrics getFontMetrics(Font font) {
FontManager fm = FontManagerFactory.getInstance();
return sun.font.FontDesignMetrics.getMetrics(font);
}
}
textAscent()
并且是从不存在的不调用更改textDescent()
的代码副本。相反,两者都重定向到第三种方法,该方法将缺少的辅助方法重新实现为.PGraphics
getFontMetrics(Font font)
parent
PApplet
PApplet
java.awt.Component.getFontMetrics(Font font)
希望有帮助。
当明确调用文件作为绘图板时,拥有原生无头版本的处理会很好。