Как сохранить несколько диаграмм JavaFX в одном файле PDF? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь сгенерировать один файл pdf из шести (6) различных диаграмм JAVAFX (круговая диаграмма, столбчатая диаграмма и линейная диаграмма).

Я могу создать только одно изображение одной диаграммы.PNG формат.Эти диаграммы отображаются все на одной AnchorPane, следовательно, по одной диаграмме за раз.

Ниже приведен код для сохранения диаграммы в виде изображений

private void chartToImage(final Node node, final File file, final int aWidth, final int aHeight, final Node childNode){

        final AnchorPane anchorPane = new AnchorPane();
        anchorPane.setMinSize(aWidth, aHeight);
        anchorPane.setMaxSize(aWidth, aHeight);
        anchorPane.setPrefSize(aWidth, aHeight);

        final ScrollPane scrollPane = new ScrollPane();
        scrollPane.setContent(anchorPane);

        final JFXPanel fxPanel = new JFXPanel();
        fxPanel.setScene(new Scene(scrollPane));

        final JFrame frame = new JFrame();
        final AnchorPane previousBaby = childNode;
        final AnchorPane previousParentPane = (AnchorPane)childNode.getParent();



        //Creating an invisible JFrame
        frame.setSize(new Dimension(64, 64));
        frame.setVisible(false);
        frame.add(fxPanel);

        anchorPane.getChildren().clear();
        AnchorPane.setLeftAnchor(node, 0.0);
        AnchorPane.setRightAnchor(node, 0.0);
        AnchorPane.setTopAnchor(node, 0.0);
        AnchorPane.setBottomAnchor(node, 0.0);
        anchorPane.getChildren().add(node);

        anchorPane.layout();

        /**
         * Handling the Snapshot operation
         */

        try {
            final SnapshotParameters snapshotParameters = new SnapshotParameters();
            snapshotParameters.setViewport(new Rectangle2D(0.0, 0.0, aWidth, aHeight));
            ImageIO.write(SwingFXUtils.fromFXImage(anchorPane.snapshot(snapshotParameters, new WritableImage(aWidth, aHeight)),
                    new BufferedImage(aWidth, aHeight, BufferedImage.TYPE_INT_ARGB)), "png", file);
            AlertMaker.showSimpleAlert("Success", "Chart image saved successfully");
        } catch (IOException ex) {
            Logger.getLogger(PerformanceAnalyzerController.class.getName()).log(Level.SEVERE, null, ex);
            AlertMaker.showErrorMessage(ex, "Error", "Failed to save the Chart as Image");
        }finally{
            Platform.runLater(() -> {
                //Return the node back into it's previous parent

                previousParentPane.getChildren().clear();
                AnchorPane.setLeftAnchor(childNode, 0.0);
                AnchorPane.setRightAnchor(childNode, 0.0);
                AnchorPane.setTopAnchor(childNode, 0.0);
                AnchorPane.setBottomAnchor(childNode, 0.0);

                previousParentPane.getChildren().add(childNode);

                frame.dispose();

            });
        }
    }

Я пытался использовать ExecutorService для захвата всехИзображения в разное время, но все напрасно возвращают исключения, т.е. «Исключение в потоке» pool-2-thread-1 «Java.lang.IllegalStateException: не в потоке приложения FX; currentThread = pool-2-thread-1».

Ниже приведен код для захвата изображений в разное время.

    @FXML
    private void performAnalysisOperation(ActionEvent event) {
        //Initialing the date ranges for searching
        LocalDate dateA1 = endDatePicker.getValue();
        LocalDate dateB1 = startDatePicker.getValue();
        System.out.println(dateA1 + "\n" + dateB1);

        String dateA = dateA1.toString() + " 00:00:00.00000";
        String dateB = dateB1.toString() + " 00:00:00.00000";

            analysisItems.setDisable(true);

            clearChart();
            piechart.setAnimated(false);
            barchart.setAnimated(false);
            linechart.setAnimated(false);


            Task task1 = new Task() {
                @Override
                protected Object call() throws Exception  {
                    clearChart();
                    ChartsHandler.barChartHandler1(barchart, chartsHandler.getBookGraphStatics(dateA, dateB), graphHandler, 1);
                    chartToImage(graphHandler, new File("C:\\Users\\Garande\\Documents/testChartGATA031T.png"), 600, 600, analyzercontainer);
                    return true;
                }
            };


            Task task2 = new Task() {
                @Override
                protected Object call() throws Exception  {
                    clearChart();
                    ChartsHandler.pieChartHandler(piechart, handler.getBookGraphStatics(), graphHandler, 1);
                    chartToImage(graphHandler, new File("C:\\Users\\Garande\\Documents/testChartGATA032T.png"), 600, 600, analyzercontainer);
                    return true;
                }
            };


            Task task3 = new Task() {
                @Override
                protected Object call() throws Exception  {
                    clearChart();
                    ChartsHandler.lineChartHandler(linechart, chartsHandler.getBookGraphStatics(dateA, dateB), graphHandler, 1);
                    chartToImage(graphHandler, new File("C:\\Users\\Garande\\Documents/testChartGATA033T.png"), 600, 600, analyzercontainer);
                    return true;
                }
            };

            //More tasks here for all the charts


            ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
            service.schedule(task2, 10, TimeUnit.SECONDS);
            service.schedule(task1, 30, TimeUnit.SECONDS);
            service.schedule(task3, 50, TimeUnit.SECONDS);

        }
    }

Я ожидаю, что программа сгенерирует изображения для всех диаграмм и сохранит их в один файл PDF.В настоящее время я использую pdfbox-2.0.13.jar для создания файлов PDF из моей программы.Но все же я не знаю, как сохранить все диаграммы одновременно в одном файле PDF.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...