打印JavaFx TableView的内容

时间:2013-05-24 15:05:00

标签: printing javafx-2 javafx

我正在寻找一种打印JavaFX TableView内容的方法。据我所知,JavaFX还没有打印功能(多么令人失望)。我找到了一些关于获取WebView屏幕截图的信息,并将其打印为图像。

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

感谢您的帮助

4 个答案:

答案 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目前尚未实施,但您可以对相关问题进行投票或评论,以表明您对该功能的兴趣。