【发布时间】:2020-04-11 05:01:40
【问题描述】:
我有两个图表覆盖在 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();
}
}
});
}
}
图表类:
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;
}
}
【问题讨论】:
-
或许你需要turn off animation。
-
我在创建图表后立即将动画设置为false,我不认为是这样...:/
-
如果您想获得帮助,请提供minimal reproducible example。
-
我编辑了我的问题,不确定编辑后是否会重新发布
标签: java javafx desktop-application snapshot