为什么JavaFX PrintJob无法正确打印节点的文本?

时间:2018-05-21 23:53:29

标签: javafx printing

我尝试打印带有文本的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 :(得分:0)

显然,屏幕上显示的字体可能与操作系统识别的字体不同。因此,当您尝试将场景打印或保存为pdf时,可能会保存随机字符作为结果。

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

上述代码通过提供操作系统已知的字体来解决问题。

请注意,并非每个人都能够产生相同的结果。我有一个朋友在他的盒子上运行相同的代码,结果很好。