のコンストラクターが環境がヘッドレスであるかどうかをチェックするため、OllieGlassのソリューションは機能しなくなりました。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
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()
からのコードのコピーです。代わりに、両方とも、欠落しているヘルパーメソッドをわずかに短いバージョンとして再実装する3番目のメソッドにリダイレクトします。PGraphics
getFontMetrics(Font font)
parent
PApplet
PApplet
java.awt.Component.getFontMetrics(Font font)
お役に立てば幸いです。
製図板としてファイルを明示的に呼び出す場合は、ネイティブのヘッドレスバージョンの処理があれば便利です。