这个答案讨论了 JavaFX 中图表集成的几种不同方法。
使用 FXGraphics2D 桥接绘制 JFreeChart
David Gilbert(JFreeChart 创建者)创建了一个允许使用 JavaFX 原语绘制 JFreeChart 的桥。该项目是FXGraphics2D:
FXGraphics2D 是针对 JavaFX Canvas 的 Graphics2D API 的免费实现。该代码是为使用 Orson Charts 和 JFreeChart 而开发的,但通常可用于任何使用 Graphics2D API 的代码。
FXGraphics2D 需要 JDK 1.8.0 或更高版本,并根据(三条款)BSD 样式许可的条款获得许可。
有关详细信息,请参阅FXGraphics2D站点和对Graphics2D 和 GraphicsContext 之间的互操作性的答案。
大卫在对另一个答案的评论中指出:
FXGraphics2D 现在直接集成在 JFreeChart(版本 1.0.18)中,因此现在包含 JavaFX 支持(需要 JDK/JRE 1.8)。
在 JavaFX 中嵌入 JFreeChart 的解决方案
使用Java 8中的SwingNode在JavaFX 应用程序中嵌入基于 Swing 的内容,例如JFreeChart 。
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.*;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.jfree.chart.*;
import org.jfree.data.general.DefaultPieDataset;
public class JFreeChartSwingNodePopulationPieChart extends Application {
@Override public void start(Stage stage) {
final SwingNode chartSwingNode = new SwingNode();
chartSwingNode.setContent(
new ChartPanel(
generatePieChart()
)
);
stage.setScene(
new Scene(
new StackPane(
chartSwingNode
)
)
);
stage.show();
}
private JFreeChart generatePieChart() {
DefaultPieDataset dataSet = new DefaultPieDataset();
dataSet.setValue("China", 1344.0);
dataSet.setValue("India", 1241.0);
dataSet.setValue("United States", 310.5);
return ChartFactory.createPieChart(
"Population 2011", dataSet, true, true, false
);
}
public static void main(String[] args) { launch(args); }
}
使用 JavaFX 图表的替代解决方案
使用 JavaFX 自己的图表框架。
JavaFX 图表不涵盖与JFreeChart完全相同的功能,但对于许多应用程序来说非常出色。
问题中发布的默认饼图代码可以使用 JavaFX 图表在 JavaFX 中轻松复制,从而无需为此类图表使用外部库。
import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.chart.*;
import javafx.stage.Stage;
public class JavaFXPopulationPieChart extends Application {
@Override public void start(Stage stage) {
final PieChart chart = new PieChart(
FXCollections.observableArrayList(
new PieChart.Data("China", 1344.0),
new PieChart.Data("India", 1241.0),
new PieChart.Data("United States", 310.5)
)
);
chart.setTitle("Population 2011");
stage.setScene(new Scene(chart));
stage.show();
}
public static void main(String[] args) { launch(args); }
}
关于 JavaFX 和 JFreeChart 功能比较
如果只有对错误栏的支持。没有它们,图表框架对科学应用程序的价值就会大大降低。
Oracle 集成示例应用程序中的JavaFX 高级烛台图演示了如何使用 JavaFX 构建烛台图。尽管误差线与烛台不同,但我认为使用现有的 JavaFX 图表库很可能实现自定义误差线图,并且代码最终会在许多方面与 Ensemble 烛台图示例相似。
但可以肯定的是,这一点仍然有效,目前利用 JFreeChart 等成熟的库更容易实现诸如误差线之类的东西。
正如 Alexander 指出的那样,如果标准 JavaFX 图表框架中缺少所需的功能,看起来它适用于广泛的用户,那么最好提交功能请求以将功能嵌入到标准库中。尽管某些类型的高级图表功能可能最好由 JavaFX 图表的 3rd 方扩展库处理(据我所知,目前没有可用的)。