如何使用 JavaFX 图表 API 生成图表图像以进行导出而无需先显示

mad*_*hub 3 java charts javafx javafx-2 javafx-8

我必须生成用于导出的折线图(另存为 png)而不显示图表。我使用了 JavaFX 网站上的现有示例。这是正确的做法吗?

这是用于生成 png 图像的示例程序,

 public class FxChartDemo extends Application {
        public static void main(String[] args) {
            launch(args);
        }
        @Override
        public void start(Stage stage) throws Exception {
            stage.setTitle("Line Chart Sample");
            //defining the axes
            final NumberAxis xAxis = new NumberAxis();
            final NumberAxis yAxis = new NumberAxis();
            xAxis.setLabel("Number of Month");
            xAxis.setLabel("Number of Month");
            //creating the chart
            LineChart<Number, Number> lineChart =
                    new LineChart<Number, Number>(xAxis, yAxis);
            lineChart.setTitle("Stock Monitoring, 2010");
            //defining a series
            XYChart.Series series = new XYChart.Series();
            series.setName("My portfolio");
            //populating the series with data
            series.getData().add(new XYChart.Data(1, 23));
            series.getData().add(new XYChart.Data(2, 14));
            series.getData().add(new XYChart.Data(3, 15));
            series.getData().add(new XYChart.Data(4, 24));
            series.getData().add(new XYChart.Data(5, 34));
            Scene scene = new Scene(lineChart, 800, 600);
            lineChart.setAnimated(false);
            lineChart.getData().add(series);
            saveAsPng(lineChart, "c:\\temp\\chart.png");
            stage.setScene(scene);
            saveAsPng(lineChart, "c:\\temp\\chart1.png");
            //stage.show();
            System.out.println("After show");
        }
        public void saveAsPng(LineChart lineChart, String path) {
            WritableImage image = lineChart.snapshot(new SnapshotParameters(), null);
            File file = new File(path);
            try {
                ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

不,这不起作用。您应该尝试更改此代码:

        ......
        saveAsPng(lineChart, "c:\\temp\\chart.png");
        stage.setScene(scene);
        saveAsPng(lineChart, "c:\\temp\\chart1.png");
        //stage.show();
        System.out.println("After show");
    }
    public void saveAsPng(LineChart lineChart, String path) {
        WritableImage image = lineChart.snapshot(new SnapshotParameters(), null);
        ......
Run Code Online (Sandbox Code Playgroud)

到:

    ......
    saveAsPng(scene, "c:\\temp\\chart.png");
    stage.setScene(scene);
    saveAsPng(scene, "c:\\temp\\chart1.png");
    //stage.show();
    System.out.println("After show");
}
public void saveAsPng(Scene scene, String path) {
    WritableImage image = scene.snapshot(null);
    ......
Run Code Online (Sandbox Code Playgroud)

非常适合我。