我只想从JavaFX图表API生成图表图像 . 我不想显示应用程序窗口,也不想启动应用程序(如果没有必要) .
public class LineChartSample extends Application {
private List<Integer> data;
@Override public void start(Stage stage) {
stage.setTitle("Line Chart Sample");
final CategoryAxis xAxis = new CategoryAxis();
final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Month");
final LineChart<String,Number> lineChart =
new LineChart<String,Number>(xAxis,yAxis);
lineChart.setTitle("Stock Monitoring, 2010");
XYChart.Series series = new XYChart.Series();
series.setName("My portfolio");
series.getData().add(new XYChart.Data("Jan", 23));
series.getData().add(new XYChart.Data("Feb", 14));
Scene scene = new Scene(lineChart,800,600);
lineChart.getData().add(series);
WritableImage image = scene.snapshot(null);
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", chartFile);
//stage.setScene(scene);
//stage.show();
}
public static void main(String[] args) {
launch(args);
}
public setData(List<Integer> data) {this.data = data;}
}
在start方法里面,我实际上需要访问外部数据才能 Build 系列数据,但是似乎无法从start方法访问外部数据,如果我将数据存储在成员变量 data
中,那么's null when the start is called. I actually don' t关心阶段和场景对象,只要图表图像可以渲染,我该如何解决问题?我想构建一个可以使用输入数据调用的API,并使用数据绘制图表,然后返回该文件 .
public File toLineChart(List<Integer> data) {
...
}
2 回答
您不需要显示
Stage
,但Node
必须附加到Scene
. 来自doc of snapshot:修改
Scene
的一个限制是它必须发生在JavaFX应用程序线程上,该线程具有必须初始化JavaFX工具包的先决条件 .初始化可以通过扩展
Application
类(launch
方法将为您执行此操作)来完成,或者作为一种解决方法,您可以在Swing Event Dispatcher Thread上创建新的JFXPanel
实例 .如果要扩展
Application
并在start
方法中执行某些代码,则确保此代码将在JavaFX应用程序线程上执行,否则您可以使用从不同线程调用的Platform.runLater(...)
块来确保相同 .Here is a possible example:
该类提供了一种静态方法,用于将图表绘制到文件中,如果创建成功与否,则返回
File
或null
.在此方法中,通过在Swing EDT上创建
JFXPanel
来初始化JavaFX Toolkit,然后创建图表,完成JavaFX Application Thread . 在该方法中使用两个布尔值来存储操作完成并成功 .在completed标志切换为true之前,该方法不会返回 .
Note: 这个实际上只是一个可以改进的(工作)例子 .
以及可能的用法
和生成的图片(charttest.png)
从命令行:
下一步:清理并构建您的程序 . 然后:在dist文件夹中找到jar文件之后:将命令提示符导航到jar所在的dist文件夹中 . 然后运行:java -jar PieChartSample.jar Banana 14 Orange 20 Grape 15
结果:与PieChartSample.jar文件位于同一文件夹中