【问题标题】:How i can use jfreeChart with Javafx2我如何将 jfreeChart 与 Javafx2 一起使用
【发布时间】:2013-05-17 11:29:00
【问题描述】:

对于 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 等)集成?

【问题讨论】:

  • JFreeChart 基于哪种技术? AWT?摇摆?

标签: javafx-2 javafx jfreechart javafx-8


【解决方案1】:

JFreeChart 是面向 Swing 的 - 虽然 JFreeChart 类本身不是 Swing 组件,但它通常显示在 org.jfree.chart.ChartPanel 上,它是 javax.swing.JPanel 的子类。它使用 ava.awt.Graphics2D 对象来绘制自己。

我想你可以使用 JFreeChart 的 createBufferedImage() 方法获取 BufferedImage,然后使用 SwingFXUtils 将其转换为 javafx.scene.image.WritableImage,但是这样你就会失去图表的交互性.

不幸的是,目前似乎没有任何方法可以在 JavaFX 中嵌入 Swing 组件

【讨论】:

  • 对于 JavaFX 中的 JFreeChart,我建议使用我发布到 GitHub 的新 FXGraphics2D 实现:github.com/jfree/fxgraphics2d
  • FXGraphics2D 现在直接集成在 JFreeChart(版本 1.0.18)中,因此现在包含 JavaFX 支持(需要 JDK/JRE 1.8)。
【解决方案2】:

此答案讨论了 JavaFX 中图表集成的几种不同方法。

使用 FXGraphics2D 桥接绘制 JFreeChart

David Gilbert(JFreeChart 创建者)创建了一个允许使用 JavaFX 原语绘制 JFreeChart 的桥梁。该项目是FXGraphics2D:

FXGraphics2D 是针对 JavaFX 画布的 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 的解决方案

使用 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自己的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 功能比较

如果只有错误栏的支持。没有它们,图表框架对科学应用的价值就会大大降低。

来自Oracle's Ensemble Sample ApplicationJavaFX Advanced Candlestick Chart 演示了如何使用JavaFX 构建candlestick chart。尽管error bars 与烛台不同,但我认为使用现有的 JavaFX 图表库很可能实现自定义错误条形图,并且代码最终会在许多方面与 Ensemble 烛台图示例相似。

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

正如 Alexander 指出的那样,如果标准 JavaFX 图表框架中缺少所需的功能,看起来它适用于广泛的用户,那么最好 file a feature request 将功能嵌入到标准中图书馆。尽管某些类型的高级图表功能可能最好由 JavaFX 图表的第 3 方扩展库处理(据我所知目前没有可用的扩展库)。

【讨论】:

  • 要是支持误差线就好了。没有它们,图表框架对科学应用的价值就会大大降低。
  • @scottb 你可以提交一份关于错误栏的 RFE,如果它们还不存在的话。
  • @scottb 您可以自己轻松添加误差线。 JavaFX ensemble 应用程序显示了自定义蜡烛图的实现,非常简单。如果您不介意处理一些额外的代码,您可以轻松地调整示例以适应错误栏。
  • 那我去看看。 Microsoft Excel 在其 ActiveX 对象模型中对误差线生成提供了强大的支持,用于图形(它包括不对称误差线),该模型与许多不同的图表类型一起运行,例如。散点图、条形图等。如果 JavaFX 图表开箱即用地提供类似级别的支持,那就太好了。
【解决方案3】:

现在可以使用 FXGraphics2D 在 JavaFX 画布上显示 JFreeChart 实例,这是用于 JavaFX 的 Graphics2D API 的免费实现。

【讨论】:

  • JavaFX 支持现在在 JFreeChart 1.0.18 中提供。
【解决方案4】:

制作这个: 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多