我正在寻找一种打印JavaFX TableView内容的方法。据我所知,JavaFX还没有打印功能(多么令人失望)。我找到了一些关于获取WebView屏幕截图的信息,并将其打印为图像。
是否可以使用Table视图执行类似的操作。如何在包含大量数据的表上处理多个页面。
感谢您的帮助
答案 0 :(得分:6)
打印API出现在fx8.0中。它可以打印节点。您可以使用javafx.print.PrinterJob类创建打印机作业。但它只打印适合打印页面的区域,而不是打印在屏幕上的区域。因此,您需要手动使节点适合页面(缩放,翻译等)。这是一个简单的打印示例:
PrinterJob printerJob = PrinterJob.createPrinterJob();
if(printerJob.showPrintDialog(primaryStage.getOwner()) && printerJob.printPage(yourNode))
printerJob.endJob();
答案 1 :(得分:3)
剪断您想要的区域
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();
}
}
}
}
答案 2 :(得分:1)
我试过这个。它首先显示页面对话窗口,然后进行缩放,翻译和打印。
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);
答案 3 :(得分:0)
据我所知,JavaFX还没有印刷功能(多么失望)。
Java 8包括JavaFX的打印功能。 https://jdk8.java.net/download.html
Java 8打印功能在RT-17383 Printing下实现,其功能与@Asimaruk的回答相同。
我找到了一些关于获取WebView屏幕截图的信息,并将其打印为图像。是否可以使用表视图执行类似的操作。
如果您不能使用Java 8,则可以执行此操作。
使用JavaFX快照api,使用SwingFXUtils将JavaFX图像转换为BufferedImage,使用Swing打印方法打印BufferedImage。
如何在包含大量数据的表上处理多个页面。
如果您不能使用Java 8,请对每个页面使用上述快照方法,在每个快照之间滚动表格数据。
另请参阅RT-17665 Make some UI controls support printing their content这是对某些控件(例如TableView)添加的直接打印API的请求,因此您可以使tableView.print()仅打印tableview而不是整个场景。此便捷的打印API目前尚未实施,但您可以对相关问题进行投票或评论,以表明您对该功能的兴趣。