我如何在Javafx2中使用jfreeChart

问题描述 投票:3回答:4

对于JavaFX2应用程序,我必须显示不同类型的Charts。我正在使用jfreeChart进行Charts创建和下面给出的代码:

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;
    }

这将返回一个图表对象。如何将其与HBox等JavaFx Node集成?

javafx-2 javafx jfreechart javafx-8
4个回答
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组件


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的答案以获取更多信息。

David在对另一个答案的评论中指出:

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,而无需为此类图表使用外部库。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9LN005My5wbmcifQ==” alt =“ 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); }
}

关于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图表的第三方扩展库处理(我所知道的目前尚不可用)。


7
投票

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


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)

© www.soinside.com 2019 - 2024. All rights reserved.