我如何使用jfreeChart与Javafx2

jav*_*aba 3 javafx jfreechart javafx-2 javafx-8

对于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;
    }
Run Code Online (Sandbox Code Playgroud)

这会返回一个图表对象.如何将其与我的JavaFx节点(如HBox等)集成?

jew*_*sea 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站点以及Graphics2D和GraphicsContext之间的互操作性答案.

大卫在另一个答案的评论中指出:

FXGraphics2D现在直接集成在JFreeChart(版本1.0.18)中,因此现在包含JavaFX支持(需要JDK/JRE 1.8).

解决方案在JavaFX中嵌入JFreeChart

使用SwingNodeJava的8嵌入基于Swing的内容,比如JFreeChart的在JavaFX应用程序.

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); }
}
Run Code Online (Sandbox Code Playgroud)

使用JavaFX图表的替代解决方案

使用JavaFX自己的图表框架.

JavaFX图表并未涵盖与JFreeChart完全相同的功能,但对于许多应用程序而言都非常出色.

问题中发布的默认饼图代码可以使用JavaFX图表在JavaFX中轻松复制,从而无需为此类图表使用外部库.

populationpiejavafx

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); }
}
Run Code Online (Sandbox Code Playgroud)

关于JavaFX和JFreeChart功能比较

如果只有支持错误栏.没有它们,图表框架对科学应用程序的价值要小得多.

JavaFX的高级烛图来自Oracle的合奏示例应用程序演示如何使用JavaFX的构建阴阳烛图.即使误差棒是从烛台不同,我想自定义错误条形图的实施将使用现有的JavaFX的图表库是完全可能的,代码最终会在许多方面给乐团阴阳烛图样本相似.

但可以肯定的是,这一点仍然有效,一些诸如错误栏之类的东西目前将更容易实现,利用JFreeChart等成熟的库.

正如Alexander指出的那样,如果标准JavaFX图表框架中缺少所需的功能,看起来它适用于广泛的用户,那么最好提交功能请求以将功能嵌入到标准库中.虽然某些高级图表功能可能最适合用于JavaFX图表的第三方扩展库(其中目前没有我知道的).

  • 如果只有支持错误栏.没有它们,图表框架对科学应用程序的价值要小得多. (2认同)

Dav*_*ert 7

现在可以使用FXGraphics2D在JavaFX Canvas上显示JFreeChart实例,FXGraphics2D是JavaFX 的Graphics2D API的免费实现.

  • 现在在JFreeChart 1.0.18中提供了JavaFX支持. (3认同)