4.2 创建第一个图表

4.2.1 概述

使用JFreeChart创建图表共有三个步骤。如下:

  • 创建一个dataset。该dataset包含图表要显示的数据。
  • 创建一个JFreeChart对象。该对象负责画这个图表。
  • 创建一个输出目标(如:一个panel,显示在屏幕上)。该输出目标画这个图表。

下面,我们使用一个简单的应用(First.java)来描述这个过程。该应用产生了一个饼图,如下图4.1所示:

图4.1 创建的第一个饼图(参考First.java)

上面描述的三个步骤,将在下面的章节里面,均有代码详细说明。

4.2.2 数据

步骤一要求我们为我们的图表创建一个dataset。使用DefaultPieDataset类可以很容易创建。如下代码:

// create a dataset...
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Category 1", 43.2);
dataset.setValue("Category 2", 27.9);
dataset.setValue("Category 3", 79.5);

注意:

JFreeChart可以使用符合PieDataset接口的任何实现数据来创建饼图。DefaultDataset类实现了PieDataset接口,提供了一种便利的使用方式。

我们可以自由的开发符合实际需的任意PieDataset接口实现。

4.2.3 创建一个饼图

步骤二关心的是我们如何使用这个dataset展示在区域中。这就需要我们创建一个JFreeChart对象,该对象使用我们的饼图dataset数据画一个图表。我们使用ChartFactory类来创建,代码如下:

// create a chart...
JFreeChart chart = ChartFactory.createPieChart(
    "Sample Pie Chart",
    dataset,
    true, // legend?
    true, // tooltips?
    false // URLs?
);

注意:

代码中将一个dataset的引用传入到工厂方法中。JFreeChart持有这个dataset引用的目的是便于在画图表时能够获得数据。使用JFreeChart创建图表有许多定制外观的方式,在这个例子中我们使用缺省的属性值。后面章节将详细介绍。

4.2.4 显示图表

最好一个步骤就是在某个地方显示该图表。JFreeChart提供了非常灵活的图表输出方式。

现在我们可以在一个屏幕的框架中显示这个图表。ChartFrame具有显示图表的机制(ChartPanel)。代码如下:

// create and display a frame...
ChartFrame frame = new ChartFrame("First", chart);
frame.pack();
frame.setVisible(true);

代码全部完成,运行main()方法,可以出现图4.1界面。

4.2.5 全部程序代码

下面是整个例子的全部代码,更加清楚的看到我们需要导入的类包和实现方法。

public class First {
    public static void main(String[] args) {
        // create a dataset...
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("Category 1", 43.2);
        dataset.setValue("Category 2", 27.9);
        dataset.setValue("Category 3", 79.5);
        // create a chart...
        JFreeChart chart = ChartFactory.createPieChart(
            "Sample Pie Chart",
            dataset,
            true, // legend?
            true, // tooltips?
            false // URLs?
        );
        // create and display a frame...
        ChartFrame frame = new ChartFrame("First", chart);
        frame.pack();
        frame.setVisible(true);
    }
}