2013-05-24 6 views
4

Я ищу способ распечатать содержимое JavaFX TableView. Я понимаю, что JavaFX пока еще не имеет возможностей для печати (какое разочарование). Я нашел некоторую информацию о скриншоте WebView, например, и распечатал его как изображение.Печать содержимого JavaFx TableView

Возможно ли сделать что-то подобное с видом таблицы. Как перейти к обработке нескольких страниц в таблицах со многими данными.

Спасибо за вашу помощь

ответ

6

печать API появилась в fx8.0. И он может печатать узлы. Вы можете создать задание принтера с классом javafx.print.PrinterJob. Но он печатает только область, которая подходит для печатной страницы, а не та, что вы на экране. Поэтому вам нужно сделать страницу, соответствующую вашей странице (масштаб, переводить и т. Д.) Руками. Вот простой пример печати:

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

JavaFX 8 функции печати доступен в JDK 8, и может быть доступен через ранний доступ builds: https://jdk8.java.net/download.html. Если у вас есть какие-либо предложения по функциональности, вы можете подать запросы функций в javafx-2-jira. –

0

Я понимаю, что JavaFX не имеет capabillities печати только пока (что Disapointment).

Java 8 включает возможности печати для JavaFX. https://jdk8.java.net/download.html

Функции печати Java 8 были реализованы под RT-17383 Printing и функционируют, как описано в ответе @ Асимарука.

Я нашел некоторую информацию о снимке экрана WebView, например, и распечатал его как изображение. Можно ли сделать что-то подобное с видом таблицы.

Вы можете это сделать, если вы не можете использовать Java 8.

Используйте снимок апи JavaFX, использование SwingFXUtils, чтобы преобразовать изображение JavaFX до методов BufferedImage, использование Качели печати для печати BufferedImage.

Как перейти к обработке нескольких страниц в таблицах с большим количеством данных.

Если вы не можете использовать Java 8, используйте приведенный выше метод моментальных снимков для каждой страницы, прокручивая данные таблицы между каждым моментальным снимком.


Также см RT-17665 Make some UI controls support printing their content который является запрос для прямой печати API добавлены некоторые элементы управления (например, Tableview), так что вы можете прямо tableView.print() для печати только TableView, а не всю сцену. Этот удобный API для печати в настоящее время не реализован, но вы можете проголосовать или прокомментировать связанную проблему, чтобы указать на вашу заинтересованность в этой функции.

+0

Привет, когда вы говорите «если я не могу использовать Java 8», в чем причины, по которым я не смогу использовать Java 8. Я создаю приложение, которое будет продано потенциальным клиентам и будет развернуто через веб-начало. Таким образом, мои клиенты должны иметь JRE 8, это правильно? Так что мой последний вопрос: могу ли я использовать Java 8 для готового продукта на рынке, учитывая, что мне придется регулярно его обновлять? В очередной раз благодарим за помощь –

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

Снипом области, которую вы хотите

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

**------------------------------------** 

Изменения размера в зависимости от формата А4 и печатей

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