我尝试打印带有文本的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.");
}
}
}
答案 0 :(得分:0)
显然,屏幕上显示的字体可能与操作系统识别的字体不同。因此,当您尝试将场景打印或保存为pdf时,可能会保存随机字符作为结果。
btn.setFont(new Font("Arial", 30));
上述代码通过提供操作系统已知的字体来解决问题。
请注意,并非每个人都能够产生相同的结果。我有一个朋友在他的盒子上运行相同的代码,结果很好。