我有两个叠加在StackPane上的图表(一个条形图和一个包含3个系列的折线图。)>
线图位于条形图的顶部,并且在应用程序中正确显示。但是,当我尝试拍摄快照时,条形图不会显示。
我尝试拍摄节点以及整个场景的快照,但仍然没有显示。我想这与它是一个背景节点有关,但我似乎无法弄清楚如何使其显示。
WritableImage snapshot = stackPane.snapshot(new SnapshotParameters(),null); ImageIO.write(SwingFXUtils.fromFXImage(snapshot,null),"png",new File("chart.png"));
我正在编辑以便添加其余代码:
控制器:
public class Controller { @FXML StackPane stackPane; public void onBtnClick(ActionEvent actionEvent) { Platform.runLater(new Runnable() { @Override public void run() { try { Graphs graphs = new Graphs(); StackPane secondaryStackpane = graphs.call(); stackPane.getChildren().addAll(secondaryStackpane.getChildren()); WritableImage snapshot = stackPane.snapshot(new SnapshotParameters(),null); ImageIO.write(SwingFXUtils.fromFXImage(snapshot,null),"png",new File("chart.png")); } catch (Exception ex) { ex.printStackTrace(); } } }); } }
Graphs类:
public class Graphs extends Task {
StackPane stackPane;
NumberAxis yAxis;
NumberAxis yAxisRight;
CategoryAxis xAxis;
NumberAxis yAxisRightBlank;
public Graphs() {
stackPane = new StackPane();
xAxis = new CategoryAxis();
xAxis.setCategories(FXCollections.<String>observableArrayList("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"));
yAxis = new NumberAxis(0, 70, 10);
yAxisRight = new NumberAxis(0, 14, 1);
yAxisRightBlank = new NumberAxis(0, 15, 1);
yAxisRightBlank.setSide(Side.RIGHT);
xAxis.setLabel("Month");
yAxis.setLabel("Level");
yAxisRight.setLabel("Level (u)");
}
void createGraph() {
BarChart<String, Number> barChart = new BarChart<String, Number>(xAxis, yAxis);
barChart.setLegendVisible(false);
barChart.setAnimated(false);
barChart.getXAxis().setVisible(true);
barChart.getData().addAll(getAverageLoadPerFTE());
LineChart<String, Number> lineChartEffective = new LineChart<String, Number>(xAxis, yAxisRight);
lineChartEffective.setLegendVisible(false);
lineChartEffective.setAnimated(false);
lineChartEffective.setCreateSymbols(true);
lineChartEffective.setAlternativeRowFillVisible(false);
lineChartEffective.setAlternativeColumnFillVisible(false);
lineChartEffective.setHorizontalGridLinesVisible(false);
lineChartEffective.setVerticalGridLinesVisible(false);
lineChartEffective.getXAxis().setVisible(true);
lineChartEffective.getYAxis().setVisible(false);
lineChartEffective.getYAxis().setTickLabelsVisible(false);
lineChartEffective.getYAxis().setOpacity(0);
lineChartEffective.getData().addAll(getEffectiveCustomerSupport());
barChart.setAnimated(false);
barChart.applyCss();
barChart.layout();
lineChartEffective.setAnimated(false);
lineChartEffective.applyCss();
lineChartEffective.layout();
stackPane.getChildren().addAll(barChart, lineChartEffective);
}
public StackPane call() {
createGraph();
Platform.runLater(new Runnable() {
@Override
public void run() {
updateProgress(100, 100);
System.out.println("from call " + progressProperty());
}
});
return this.stackPane;
}
private XYChart.Series<String,Number> getEffectiveCustomerSupport() {
XYChart.Series<String, Number> series = new XYChart.Series<String, Number>();
series.getData().add(new XYChart.Data<String,Number>("Jan", 2.9 ));
series.getData().add(new XYChart.Data<String,Number>("Feb", 2.7 ));
series.getData().add(new XYChart.Data<String,Number>("Mar", 3.3 ));
series.getData().add(new XYChart.Data<String,Number>("Apr", 3.4 ));
series.getData().add(new XYChart.Data<String,Number>("May", 3.3 ));
series.getData().add(new XYChart.Data<String,Number>("Jun", 3.2 ));
series.getData().add(new XYChart.Data<String,Number>("Jul", 3.3 ));
series.getData().add(new XYChart.Data<String,Number>("Aug", 4 ));
series.getData().add(new XYChart.Data<String,Number>("Sep", 3.8 ));
series.getData().add(new XYChart.Data<String,Number>("Oct", 4.1 ));
series.getData().add(new XYChart.Data<String,Number>("Nov", 0 ));
series.getData().add(new XYChart.Data<String,Number>("Dec", 0 ));
series.setName("Effective customer support");
return series;
}
private XYChart.Series<String,Number> getAverageLoadPerFTE() {
XYChart.Series<String, Number> series = new XYChart.Series<String, Number>();
series.getData().add(new XYChart.Data<String,Number>("Jan", 58 ));
series.getData().add(new XYChart.Data<String,Number>("Feb", 54 ));
series.getData().add(new XYChart.Data<String,Number>("Mar", 47 ));
series.getData().add(new XYChart.Data<String,Number>("Apr", 34 ));
series.getData().add(new XYChart.Data<String,Number>("May", 33 ));
series.getData().add(new XYChart.Data<String,Number>("Jun", 32 ));
series.getData().add(new XYChart.Data<String,Number>("Jul", 30 ));
series.getData().add(new XYChart.Data<String,Number>("Aug", 36 ));
series.getData().add(new XYChart.Data<String,Number>("Sep", 29 ));
series.getData().add(new XYChart.Data<String,Number>("Oct", 33 ));
series.getData().add(new XYChart.Data<String,Number>("Nov", 0 ));
series.getData().add(new XYChart.Data<String,Number>("Dec", 0 ));
series.setName("Average load per FTE");
return series;
}
}
我有两个叠加在StackPane上的图表(一个条形图和一个包含3个系列的折线图)。折线图位于第一个栏的顶部,并在应用程序中正确显示。但是,当我...
此问题实质上是以下内容的重复: