Почему JavaFX PrintJob не может правильно распечатать текст узла? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь напечатать сцену javafx с текстами на ней.Я создал этот очень простой тестовый код.Как вы можете видеть, это стандартное приложение hello world с кнопкой «Say Hello World».

Приложение предполагает распечатать эту сцену с помощью кнопки «Say« Hello World »».из формы в порядке. Однако тексты на кнопке отображаются в виде нераспознаваемых символов. Я использую Mac.

Я пытаюсь реализовать отчет javafx, и для этого требуется распечатать сцену javafx.

Любая помощь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вы можете успешно напечатать символы. Поэтому, по крайней мере, я знаю, что это проблема моего принтера.

Чтобы упростить тест, вы можете сохранитьрезультат в виде файла PDF вместо распечатки.

package javafxprinttest;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.print.PrinterJob;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class JavaFXPrintTest extends Application {

@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");


    StackPane root = new StackPane();
    root.getChildren().add(btn);
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
            print(root);
        }
    });

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

private void print(Node node) 
{
    // Define the Job Status Message
            System.out.println("Creating a printer job...");
    // Create a printer job for the default printer
    PrinterJob job = PrinterJob.createPrinterJob();

    if (job != null && job.showPrintDialog(node.getScene().getWindow())) 
    {
        // Print the node
        boolean printed = job.printPage(node);

        if (printed) 
        {
            // End the printer job
            job.endJob();
        } 
        else 
        {
            // Write Error Message
                            System.out.println("Printing failed.");
        }
    } 
    else 
    {
        // Write Error Message
                    System.out.println("Could not create a printer job.");
    }
}

}

1 Ответ

0 голосов
/ 22 мая 2018

Очевидно, что шрифт, отображаемый на экране, может отличаться от шрифта, который распознает ОС.Поэтому, когда вы пытаетесь распечатать или сохранить сцену в формате PDF, случайные символы могут быть сохранены в результате.

btn.setFont(new Font("Arial", 30));

Приведенный выше код устраняет проблему, предоставляя шрифт, известный операционной системе.

Обратите внимание, что не все смогут получить одинаковый результат.У меня есть мой друг, чтобы запустить тот же код на его коробке, и результат показывает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...