【问题标题】:Print contents of JavaFx TableView打印 JavaFx TableView 的内容
【发布时间】:2013-05-20 05:45:48
【问题描述】:

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

是否可以使用表格视图执行类似的操作。如何处理包含许多数据的表上的多个页面。

感谢您的帮助

【问题讨论】:

    标签: printing javafx-2 javafx


    【解决方案1】:

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

       PrinterJob printerJob = PrinterJob.createPrinterJob();
       if(printerJob.showPrintDialog(primaryStage.getOwner()) && printerJob.printPage(yourNode))
           printerJob.endJob();
    

    【讨论】:

    • JavaFX 8 打印功能在 JDK 8 中可用,并且可以通过早期访问版本访问:jdk8.java.net/download.html。如果您对功能有任何建议,您可以在 javafx-2-jira 中提出功能请求。
    【解决方案2】:

    剪掉你想要的区域

    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();
                        }
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

      我已经试过了。它首先显示一个页面对话窗口,然后进行缩放、翻译和打印。

      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);
      

      【讨论】:

        【解决方案4】:

        我知道 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,对每个页面使用上面的snapshot方法,在每个snapshot之间滚动表格数据。


        另请参阅RT-17665 Make some UI controls support printing their content,这是对添加到某些控件(例如 TableView)的直接打印 api 的请求,因此您可以右 tableView.print() 仅打印 tableview 而不是整个场景。此便捷的打印 API 目前尚未实现,但您可以对相关问题进行投票或评论,以表明您对该功能的兴趣。

        【讨论】:

        • 您好,当您说“如果我不能使用 Java 8”时,我无法使用 Java 8 的原因是什么。我正在构建一个将出售给潜在客户的应用程序将通过 web start 部署。所以我的客户必须拥有 JRE 8,对吗?所以我想我的最后一个问题是考虑到我必须定期更新它,我是否可以将 Java 8 用于最终的市场就绪产品?再次感谢您的帮助
        猜你喜欢
        • 2016-09-02
        • 2015-12-15
        • 2019-03-05
        • 1970-01-01
        • 2015-11-02
        • 2017-10-20
        • 2012-12-30
        • 1970-01-01
        • 2021-07-07
        相关资源
        最近更新 更多