我正在寻找一种打印 JavaFX TableView 内容的方法。我知道 JavaFX 还没有打印功能(真是令人失望)。例如,我找到了一些关于截取 WebView 并将其打印为图像的信息。
是否可以使用表格视图做类似的事情。如何处理具有许多数据的表上的多个页面。
谢谢你的帮助
打印 API 出现在 fx8.0 中。它可以打印节点。您可以使用 javafx.print.PrinterJob 类创建打印机作业。但它只打印适合打印页面的区域,而不是您在屏幕上的区域。因此,您需要手动使您的节点适合页面(缩放、翻译等)。这是简单的打印示例:
PrinterJob printerJob = PrinterJob.createPrinterJob();
if(printerJob.showPrintDialog(primaryStage.getOwner()) && printerJob.printPage(yourNode))
printerJob.endJob();
剪掉你想要的区域
Rectangle rect = new Rectangle(0,0,dataDisplayAreaAnchorPane.getWidth(),dataDisplayAreaAnchorPane.getHeight());
dataDisplayAreaAnchorPane.setClip(rect);
WritableImage writableImage;
writableImage = new WritableImage((int) dataDisplayAreaAnchorPane.getPrefWidth(),
(int) dataDisplayAreaAnchorPane.getPrefHeight());
dataDisplayAreaAnchorPane.snapshot(null, writableImage);
eventDispatcher.printLandscape(writableImage);
**------------------------------------**
根据A4纸尺寸调整大小并打印
public void print(WritableImage writableImage, Stage primaryStage) {
ImageView imageView =new ImageView(writableImage);
Printer printer = Printer.getDefaultPrinter();
PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.DEFAULT);
double scaleX = pageLayout.getPrintableWidth() / imageView.getBoundsInParent().getWidth();
double scaleY = pageLayout.getPrintableHeight() / imageView.getBoundsInParent().getHeight();
imageView.getTransforms().add(new Scale(scaleX, scaleY));
PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
boolean successPrintDialog = job.showPrintDialog(primaryStage.getOwner());
if(successPrintDialog){
boolean success = job.printPage(pageLayout,imageView);
if (success) {
job.endJob();
}
}
}
}
我试过这个。它首先显示一个页面对话窗口,然后进行缩放、翻译和打印。
cmItem2.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e){
Printer printer = Printer.getDefaultPrinter();
Stage dialogStage = new Stage(StageStyle.DECORATED);
PrinterJob job = PrinterJob.createPrinterJob(printer);
if (job != null) {
boolean showDialog = job.showPageSetupDialog(dialogStage);
if (showDialog) {
table.setScaleX(0.60);
table.setScaleY(0.60);
table.setTranslateX(-220);
table.setTranslateY(-70);
boolean success = job.printPage(table);
if (success) {
job.endJob();
}
table.setTranslateX(0);
table.setTranslateY(0);
table.setScaleX(1.0);
table.setScaleY(1.0);
}
}
}});
ContextMenu menu = new ContextMenu();
menu.getItems().addAll(cmItem1, cmItem2);
table.setContextMenu(menu);
我知道 JavaFX 还没有打印功能(真是令人失望)。
Java 8 包括 JavaFX 的打印功能。 https://jdk8.java.net/download.html
Java 8 打印功能是在RT-17383 打印下实现的,功能如@Asimaruk 的回答中所述。
例如,我找到了一些关于截取 WebView 并将其打印为图像的信息。是否可以使用表格视图做类似的事情。
如果你不能使用 Java 8,你可以这样做。
使用 JavaFX 快照 api,使用 SwingFXUtils 将 JavaFX 图像转换为 BufferedImage,使用 Swing 打印方法打印 BufferedImage。
如何处理具有许多数据的表上的多个页面。
如果不能使用 Java 8,则对每个页面使用上述快照方法,在每个快照之间滚动表数据。
另请参阅RT-17665 使某些 UI 控件支持打印其内容,这是对添加到某些控件(例如 TableView)的直接打印 api 的请求,因此您可以正确 tableView.print() 仅打印 tableview 而不是整个场景. 目前尚未实现此便捷的打印 API,但您可以对相关问题进行投票或评论,以表明您对该功能的兴趣。