对于JavaFX2应用程序,我必须显示不同类型的图表。我正在使用jfreeChart创建图表和代码如下:
public static JFreeChart generatePieChart() {
DefaultPieDataset dataSet = new DefaultPieDataset();
dataSet.setValue("China", 25);
dataSet.setValue("India", 25);
dataSet.setValue("United States", 50);
JFreeChart chart = ChartFactory.createPieChart(
"World Population by countries", dataSet, true, true, false);
return chart;
}
这会返回一个图表对象。如何将其与我的JavaFx节点(如HBox等)集成?
答案 0 :(得分:19)
本回答讨论了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网站和Interoperability between Graphics2D and GraphicsContext的答案。
大卫在另一个答案的评论中指出:FXGraphics2D现在直接集成在JFreeChart(版本1.0.18)中,因此现在包含了JavaFX支持(需要JDK / JRE 1.8)。
解决方案在JavaFX中嵌入JFreeChart
使用SwingNode中的Java 8在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自己的charting framework。
JavaFX图表不包含与JFreeChart完全相同的功能,但对于许多应用程序而言非常出色。
使用JavaFX图表在问题中发布的默认饼图代码可以简单地为replicated in 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功能比较
如果只支持错误栏。没有它们,图表框架对科学应用程序的价值要小得多。
来自JavaFX Advanced Candlestick Chart的Oracle's Ensemble Sample Application演示了如何使用JavaFX构建candlestick chart。尽管error bars与烛台不同,但我认为使用现有的JavaFX图表库可以很好地实现自定义错误条形图,并且代码在很多方面最终会与Ensemble烛台图表样本类似。
但是可以肯定的是,这一点仍然有效,目前利用JFreeChart等成熟的库可以更容易地实现错误条等一些内容。
正如亚历山大指出的那样,如果标准JavaFX图表框架中缺少所需的功能,看起来它适用于广泛的用户,那么最好file a feature request将功能嵌入到标准库。虽然某些高级图表功能可能最好由用于JavaFX图表的第三方扩展库处理(其中目前没有我知道的)。
答案 1 :(得分:7)
现在可以使用FXGraphics2D在JavaFX Canvas上显示JFreeChart实例,这是JavaFX的Graphics2D API的免费实现。
答案 2 :(得分:2)
JFreeChart是面向Swing的 - 虽然JFreeChart类本身不是Swing组件,但它通常显示在org.jfree.chart.ChartPanel上,它是javax.swing.JPanel的子类。它使用ava.awt.Graphics2D对象来绘制自己。
我想你可以使用JFreeChart的createBufferedImage()方法获取BufferedImage,然后使用SwingFXUtils将其转换为javafx.scene.image.WritableImage,但是你会丢失图表的交互性质
不幸的是,目前似乎没有办法在JavaFX中嵌入Swing组件
答案 3 :(得分:0)
制作:
chartSwingNode.setContent(
new ChartPanel(
generatePieChart()
)
);
仅在运行时带此错误(代码编译): >
线程“ AWT-EventQueue-0”中的异常java.util.MissingResourceException:找不到包java.util.PropertyResourceBundle的资源,键Save_as 在java.util.ResourceBundle.getObject(ResourceBundle.java:450) 在java.util.ResourceBundle.getString(ResourceBundle.java:407) 在org.jfree.chart.ChartPanel.createPopupMenu(ChartPanel.java:2785) 在org.jfree.chart.ChartPanel(ChartPanel.java:577) 在org.jfree.chart.ChartPanel。(ChartPanel.java:523) 在org.jfree.chart.ChartPanel。(ChartPanel.java:426)