プレゼンツールのことを javafx-ja の ML で話した時に、印刷機能があるといいですねというコメントをいただいたので、ちょっと調べてみました。
javafx-ja ML http://groups.google.co.jp/group/javafx-ja
実をいうと、JavaFX 1.1 には印刷の機能がありません。
でも、ご安心。Java の機能を使って印刷をすることができます。
Java で印刷する場合、java.awt.print.Printable もしくは java.awt.print.Pegeable のどちらかのインタフェースを実装したクラスを使って、print メソッドを実装します。
print メソッドの第 1 引数は java.awt.Graphics オブジェクトなので、コンポーネントの paint メソッド (もしくは print/printAll メソッド) をこの Graphics オブジェクトを引数にしてコールすれば OK。
後は、コンポーネントの paint メソッドをどうやってコールするかです。
これは 5/17 に書いたように Node オブジェクトから JSGPanel オブジェクトを取りだして、その JSGPanel の paint メソッドを呼べば大丈夫のようです。
以下に、サンプルのプログラムを載せておきます。5/17 と同じようにコンパイル時のクラスパスに Scenario.jar を加える必要があります。
ボタンをクリックすると、プリンタのダイアログを表示して、印刷します。
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;
import javax.swing.JComponent;
import javafx.ext.swing.SwingButton;
import javafx.ext.swing.SwingLabel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
class FXPrintable extends Printable {
public-init var comp: JComponent;
public override function print(g: Graphics,
pageformat: PageFormat,
index: Integer): Integer {
// 印刷可能領域分だけ原点を移動
var offsetX = pageformat.getImageableX();
var offsetY = pageformat.getImageableX();
var g2d = g as Graphics2D;
g2d.translate(offsetX, offsetY);
if (index == 0) {
comp.paint(g2d);
return Printable.PAGE_EXISTS;
} else {
return Printable.NO_SUCH_PAGE;
}
}
};
class PrintableNode extends Group {
public function print(): Void {
var printable = FXPrintable {
comp: this.impl_getSGNode().getPanel()
}
// プリンタダイアログを表示して印刷
var job = PrinterJob.getPrinterJob();
job.setPrintable(printable);
job.printDialog();
}
};
var node: PrintableNode = PrintableNode {
content: [
Rectangle {
x: 10, y: 10
width: 140, height: 90
fill: Color.RED
},
SwingLabel {
translateX: 100 translateY: 100
text: "Label"
},
SwingButton {
translateX: 20 translateY: 120
text: "Print"
action: function() {
// 印刷
node.print();
}
}
]
};
var stage = Stage {
title : "Printing Test"
scene: Scene {
width: 200
height: 200
content: node
}
};