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.