Desde Java 8 es posible de una forma muy sencilla realizar impresiones de lo que vemos en una aplicación JavaFX.

Aprenderás

  • Imprimir desde una aplicación JavaFX

Requisitos

  • Al menos una conexión a una Impresora física o virtual.

Aplicación JavaFX

Partirás de una aplicación JavaFX. Como sabemos una aplicación simple de escritorio JavaFX se ve así:

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        // Aquí vendrá el nuevo código
        
        Scene scene = new Scene(vBox, 400, 260);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

El vBox lo crearás en el siguiente paso.

Preparando la interfaz

La aplicación será sencilla, solo tendrá un lugar donde colocar texto en varias líneas, un TextArea y botón que se encargará de Imprimir.

TextArea textArea = new TextArea();

Button printButton = new Button("Imprimir");

Como la aplicación solo tendrá eso usamos un VBox con espacios internos (Spacing) y espacios a los lados (padding) y que estén uno debajo de otro.

VBox vBox = new VBox();
vBox.getChildren().add(textArea);
vBox.getChildren().add(printButton);
vBox.setPadding(new Insets(20, 20, 20, 20));
vBox.setSpacing(20);

Si ejecutas la aplicación tendrás algo así:

Acción del botón

printButton.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        imprimir(textArea);
    }
});

Y el método imprimir() será mas o menos así:

private void imprimir(Node node) {

}

node representa todo aquello que deseas imprimir, es decir que parte de la aplicación, en otras palabras puedes imprimir un ListView, TextView, el mismo VBox, etc. En este caso imprimiremos directamente el TextArea.

Imprimir

Verás lo sencillo que es:

Un PrinterJob como su nombre lo dice es el que se encarga del trabajo de la impresora, es el objeto principal que podemos configurar y el que se encarga de imprimir.

¿Cómo se crea uno?

PrinterJob job = PrinterJob.createPrinterJob();

Esto puede crear el PrinterJob pero pueden haber algunos problemas, no tienes ninguna impresora conectada, etc. por lo tanto es siempre necesario preguntar si es nulo o no, de la siguiente forma:

if (job != null) {
  
}

Podrías poner un mensaje por el caso contrario para mostrar al usuario que algo salió mal.

¿Qué luego?

Lo que viene es: (dentro del if anterior)

if (job.showPrintDialog(node.getScene().getWindow())) {
    if (job.printPage(node)) {
        job.endJob();
    }
}

Tenemos varias opciones para listar las impresoras conectadas al computador, obtener la impresora por defecto, etc.

Una de las formas más adecuadas para tu primera aplicación es mostrar una ventana o diálogo donde aparezcan todas las impresoras, algunas configuraciones y finalmente el botón de imprimir. Eso es lo que hacemos en el código mostrado.

Uniendo todo

Finalmente tu código debería verse así:

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        TextArea textArea = new TextArea();

        Button printButton = new Button("Imprimir");

        VBox vBox = new VBox();
        vBox.getChildren().add(textArea);
        vBox.getChildren().add(printButton);
        vBox.setPadding(new Insets(20, 20, 20, 20));
        vBox.setSpacing(20);
        
        printButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                imprimir(textArea);
            }
        });

        Scene scene = new Scene(vBox, 400, 260);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void imprimir(Node node) {
        PrinterJob job = PrinterJob.createPrinterJob();
        if (job != null) {
            if (job.showPrintDialog(node.getScene().getWindow())) {
                if (job.printPage(node)) {
                    job.endJob();
                }
            }
        }
    }
}

Prueba colocando texto dentro del TextArea y imprime.

Debería aparecer una pantalla de tu sistema operativo para seleccionar impresora e imprimir: (así se vería en una Mac por ejemplo)

¿Algo raro?

Es posible que si imprimes texto este se muestre con símbolos raros, puede deberse por que no especificamos la fuente (tipo de letra) de lo que queremos imprimir.

¿Cómo lo arreglamos?

Por ejemplo podríamos hacer que el TextArea tenga el tipo de fuente Arial de la siguiente manera.

textArea.setFont(Font.font("Arial"));

Puedes colocarlo luego de haber creado el TextArea, y puedes usar cualquier otro tipo de letra que tengas en tu computadora, si no tienes Arial (si es Windows) puedes probar otra, Helvetica por ejemplo.