Я пытаюсь сгенерировать один файл 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.Спасибо.