JavaFX StackPane快照不显示背景层

问题描述 投票:-3回答:1

我有两个叠加在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个系列的折线图)。折线图位于第一个栏的顶部,并在应用程序中正确显示。但是,当我...

java javafx desktop-application snapshot
1个回答
0
投票

此问题实质上是以下内容的重复:

© www.soinside.com 2019 - 2024. All rights reserved.