当前位置: 首页 > 知识库问答 >
问题:

如何在Javafx2中使用jfreeChart

冯嘉荣
2023-03-14
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等)集成?

共有1个答案

傅自明
2023-03-14

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

使用FXGraphics2D桥绘制JFreeChart

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

FXGraphics2D现在直接集成在JFreeChart中(版本1.0.18),所以现在包含了JavaFX支持(需要JDK/JRE1.8)。

在JavaFX中嵌入JFreeChart的解决方案

使用Java8中的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图表进行简单的复制,从而无需使用外部库来生成此类图表。

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的功能比较

要是支持错误条就好了。没有它们,图表框架对科学应用程序的价值就小得多。

 类似资料:
  • 我的应用程序中有SplitPane。这是SplitPane具有默认宽度的分隔符。如何设置SplitPane分隔符的宽度

  • 问题内容: JavaFX2的TableView具有“用户在运行时重新排序列”的功能。我想为我的应用程序中的一个特定表禁用此功能。 查看API文档,没有明显的API挂钩。但是,有-property。根据文档,它代表 属于此TableView的TableColumns。当用户重新排序TableView列时,此列表将更新以反映当前的视觉顺序。 希望我至少能够在发生更改后重置更改,所以我尝试添加一个侦听器

  • 问题内容: 我有一个TextField可以输入搜索词,还有一个“ Go”按钮。但是在JavaFX2中,我如何做到这一点,以便在TextField中按Enter键可以执行操作? 谢谢 :) 问题答案: 您可以使用TextField的onAction属性并将其绑定到控制器中的方法。 在您的FXML文件中:

  • 我必须找到新的Java桌面应用程序的技术。我不想使用swing,但我找不到好的和透视图的替代方案。我了解JavaFX,但我有很强的要求:它必须看起来很好,而不是在linux、windows和Macox上。JavaFX在每个平台上都能正常工作吗?我在使用JavaFX时会发现哪些大麻烦?

  • 希望我能把问题弄得尽可能清楚。我正在使用JavaFX库为GUI开发一个小型java应用程序。我正在做一个POP连接,并将消息存储为ObservableList。为此,我使用javax.mail。我将这个observablelist传递给一个tableview,并通过以下方式将所需的值传递给TableColumns: Subject和sentDate是完美的读入。但不幸的是,“from”将对象引用添