package test.printing.app; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.print.PrinterJob; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.text.Text; import javafx.stage.Stage; public class PrintingTest1 extends Application { final VBox root = new VBox(); final HBox paneForPrinting = new HBox(); final HBox paneWithButtonAndStatus = new HBox(); PrinterJob printerJob = null; final Text jobstatus = new Text(); @Override public void start(final Stage primaryStage) { Button printBtn = new Button("Print"); printerJob = PrinterJob.createPrinterJob(); jobstatus.textProperty().bind(printerJob.jobStatusProperty().asString()); printBtn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent t) { if (PrinterJob.JobStatus.NOT_STARTED != printerJob.getJobStatus()) { printerJob = PrinterJob.createPrinterJob(); jobstatus.textProperty().bind(printerJob.jobStatusProperty().asString()); } callPrintInOtherThread(printerJob); } }); root.getChildren().addAll(paneForPrinting,paneWithButtonAndStatus); paneWithButtonAndStatus.getChildren().addAll(printBtn,new Text("job status:"),jobstatus); paneForPrinting.getChildren().add(new Circle(30){{setFill(Color.RED);}}); Scene scene = new Scene(root,400,300); primaryStage.setTitle("Canvas printing"); primaryStage.setScene(scene); primaryStage.show(); } protected void print(final PrinterJob printerJob) { printerJob.printPage(paneForPrinting); printerJob.endJob(); } public void callPrintInOtherThread(final PrinterJob printerJob) { new Thread(new Runnable() { public void run() { print(printerJob); } }).start(); } public static void main(String[] args) { launch(args); } }