【问题标题】:Javafx-snapshot of scene doesnt show values and series场景的 Javafx-snapshot 不显示值和系列
【发布时间】:2016-05-20 23:11:01
【问题描述】:

我做了一个非常短的应用程序,它使用 javafx 来生成图表。应用程序显示正确的值(图表),但是当我做快照时,图像只显示轴和标签,而不是系列和值。

    stage.setTitle("Line Chart Sample");        
    final DateAxis xAxis = new DateAxis();
    final NumberAxis yAxis = new NumberAxis();

    xAxis.setLabel("Number of Month");
    yAxis.setLabel("Count");
    final LineChart<Date, Number> lineChart =  new LineChart<>(xAxis,yAxis);       
    Scene scene  = new Scene(lineChart,1000,700);

    lineChart.setTitle("Stock Monitoring, 2010");
    XYChart.Series series = new XYChart.Series();
    series.setName("My portfolio");

    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 15).getTime(), 23));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 16).getTime(), 14));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 17).getTime(), 15));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 18).getTime(), 24));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 19).getTime(), 34));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 20).getTime(), 36));
    series.getData().add(new XYChart.Data(new GregorianCalendar(2012, 11, 21).getTime(), 22));
    lineChart.getData().add(series);        
    stage.setScene(scene);
    stage.show();
    WritableImage img = new WritableImage(1000, 700); 
    File file = new File("saved.png");      
    scene.snapshot(img);        
    RenderedImage renderedImage = SwingFXUtils.fromFXImage(img, null);        
    ImageIO.write(renderedImage,"png", file);      

here is a saved file

here is a screenshot from app

我不知道我做错了什么。

【问题讨论】:

    标签: java javafx charts screenshot snapshot


    【解决方案1】:

    默认情况下,图表是动画的。快照发生在(简短)动画完成之前,因此不会出现数据。打电话

    lineChart.setAnimated(false);
    

    强制布局和应用 CSS(它决定了数据的线条和节点如何绘制)可能也是明智的。通常这些仅在第一次场景渲染时完成,因此您的快照可能在这些发生之前发生。你需要通过调用来做到这一点

    lineChart.applyCss();
    lineChart.layout();
    

    图表添加到场景之后,以及数据添加到图表之后。

    这是一个 SSCCE:

    import java.awt.image.RenderedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    import javafx.application.Application;
    import javafx.embed.swing.SwingFXUtils;
    import javafx.scene.Scene;
    import javafx.scene.chart.LineChart;
    import javafx.scene.chart.NumberAxis;
    import javafx.scene.chart.XYChart;
    import javafx.scene.image.WritableImage;
    import javafx.stage.Stage;
    
    public class SnapshotChart extends Application {
    
        @Override
        public void start(Stage stage) throws IOException {
            stage.setTitle("Line Chart Sample");        
            final NumberAxis xAxis = new NumberAxis();
            final NumberAxis yAxis = new NumberAxis();
    
            xAxis.setLabel("Number of Month");
            yAxis.setLabel("Count");
            final LineChart<Number, Number> lineChart =  new LineChart<>(xAxis,yAxis); 
            lineChart.setAnimated(false);
            Scene scene  = new Scene(lineChart,1000,700);
    
    
            lineChart.setTitle("Stock Monitoring, 2010");
            XYChart.Series<Number, Number> series = new XYChart.Series<>();
            series.setName("My portfolio");
    
            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));
            series.getData().add(new XYChart.Data<>(6, 36));
            series.getData().add(new XYChart.Data<>(7, 22));
            lineChart.getData().add(series);        
    
            lineChart.applyCss();
            lineChart.layout();         
    
            stage.setScene(scene);
            stage.show();
            WritableImage img = new WritableImage(1000, 700); 
            File file = new File("saved.png");      
            scene.snapshot(img);        
            RenderedImage renderedImage = SwingFXUtils.fromFXImage(img, null);        
            ImageIO.write(renderedImage,"png", file);  
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    【讨论】:

    • 它对我有用,但我必须对您的代码进行大量修改才能获得一个工作示例。 (例如,DateAxis 是什么?)。你能把问题中的代码扩展成minimal reproducible example吗?
    • 好的,我很抱歉。 DateAxis 是 javafx(myjavafx.blogspot.cz/2013/09/…) 中日期轴的开源代码。但即使我用数字轴尝试过,我仍然有相同的结果(没有系列值的图表)。这几乎就是所有,除了类的导入和名称。
    • 查看更新。您可能需要applyCss()layout()
    • 这可能也解决了您的其他问题。如果它回答了问题,请将其标记为正确。
    • 您不需要任何声誉来将问题标记为正确(这与投票不同);通过这样做,您实际上会获得声誉。只需点击复选标记。
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多