5

我正在寻找一种打印 JavaFX TableView 内容的方法。我知道 JavaFX 还没有打印功能(真是令人失望)。例如,我找到了一些关于截取 WebView 并将其打印为图像的信息。

是否可以使用表格视图做类似的事情。如何处理具有许多数据的表上的多个页面。

谢谢你的帮助

4

4 回答 4

6

打印 API 出现在 fx8.0 中。它可以打印节点。您可以使用 javafx.print.PrinterJob 类创建打印机作业。但它只打印适合打印页面的区域,而不是您在屏幕上的区域。因此,您需要手动使您的节点适合页面(缩放、翻译等)。这是简单的打印示例:

   PrinterJob printerJob = PrinterJob.createPrinterJob();
   if(printerJob.showPrintDialog(primaryStage.getOwner()) && printerJob.printPage(yourNode))
       printerJob.endJob();
于 2013-05-24T16:48:49.040 回答
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();
                    }
                }
            }
        }
于 2015-04-14T07:02:08.120 回答
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);
于 2014-11-16T15:49:23.013 回答
0

我知道 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,但您可以对相关问题进行投票或评论,以表明您对该功能的兴趣。

于 2013-05-24T16:49:55.020 回答