import javafx.application.Application;
import javafx.print.PrinterJob;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class App extends Application {

    Pane printPane;

    @Override
    public void start(Stage stage) {
        var scene = new Scene(getView(), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

    private Pane getView() {
        var flowPane = new FlowPane(getCirclePane(), getRectPane());
        var b = new Button("Print");
        printPane = flowPane;
        b.setOnAction((t) -> {
            var job = PrinterJob.createPrinterJob();

            if (job != null && job.showPrintDialog(null)) {
                if (job.printPage(printPane)) {
                    job.endJob();
                }
            }

        });
        var bp = new BorderPane();
        bp.setCenter(flowPane);
        bp.setBottom(b);

        return bp;
    }

    private Pane getCirclePane() {
        var pane = new Pane();
        var circle = new Circle(100, 100, 45);
        pane.setClip(circle);
        var text = new Text(75, 100, "Circle");
        pane.getChildren().add(text);
        for (int i = 0; i < 10; i++) {
            double ox = i * 25;
            pane.getChildren().add(new Line(ox, 200, ox + 25, 0));
            pane.getChildren().add(new Line(ox, 0, ox + 25, 200));
        }

        return pane;
    }

    private Pane getRectPane() {
        var pane = new Pane();
        var rect = new Rectangle(50, 50, 200, 125);
        pane.setClip(rect);
        var text = new Text(125, 100, "Rectangle");
        pane.getChildren().add(text);
        for (int i = 0; i < 10; i++) {
            double ox = i * 25;
            pane.getChildren().add(new Line(ox, 200, ox + 25, 0));
            pane.getChildren().add(new Line(ox, 0, ox + 25, 200));
        }

        return pane;
    }

}