## 5.10 實例講解
### 5.10.1 體會
也分為三層界面顯示層、數據層、控制層。
+ 數據層比較復雜。每個圖形有不同的數據類型。Dataset類控制。
+ 控制層Plot,餅圖使用PiePlot設置顯示的圖形的面貌的控制,JFreeChart最豐富的功能。
+ 設置片區顏色
+ 設置標簽(文本格式、背景顏色等)
+ 設置是否取出某塊。
+ 設置餅圖是否為圓形
+ 設置餅圖旋轉。
+ 顯示層JFreeChart使用數據、控制直接將數據顯示出來。
### 5.10.2 類PieChartDemo1.java
效果圖如下:

代碼編寫典型的使用了面對對象的方法:

全部代碼如下:
```
package demo;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class PieChartDemo1 extends ApplicationFrame {
/**
*
*/
private static final long serialVersionUID = 2598557557724085474L;
public PieChartDemo1(String string) {
super(string);
JPanel jpanel = createDemoPanel();
jpanel.setPreferredSize(new Dimension(500, 270));
setContentPane(jpanel);
}
private static PieDataset createDataset() {
DefaultPieDataset defaultpiedataset = new DefaultPieDataset();
defaultpiedataset.setValue("One", new Double(43.2));
defaultpiedataset.setValue("Two", new Double(10.0));
defaultpiedataset.setValue("Three", new Double(27.5));
defaultpiedataset.setValue("Four", new Double(17.5));
defaultpiedataset.setValue("Five", new Double(11.0));
defaultpiedataset.setValue("Six", new Double(19.4));
return defaultpiedataset;
}
private static JFreeChart createChart(PieDataset piedataset) {
JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 1",
piedataset, true, true, false);
TextTitle texttitle = jfreechart.getTitle();
texttitle.setToolTipText("A title tooltip!");
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setLabelFont(new Font("Arial Black", 0, 20));
pieplot.setNoDataMessage("No data available");
pieplot.setCircular(false);
pieplot.setLabelGap(0.02);
return jfreechart;
}
public static JPanel createDemoPanel() {
JFreeChart jfreechart = createChart(createDataset());
return new ChartPanel(jfreechart);
}
public static void main(String[] strings) {
PieChartDemo1 piechartdemo1 = new PieChartDemo1("Pie Chart Demo 1");
piechartdemo1.pack();
RefineryUtilities.centerFrameOnScreen(piechartdemo1);
piechartdemo1.setVisible(true);
}
}
```
### 5.10.3 類PieChartDemo2.java
功能:
“取出“片區顯示。
效果:

代碼:
```
private static JFreeChart createChart(PieDataset piedataset) {
JFreeChart jfreechart = ChartFactory.createPieChart("PieChart Demo 2", piedataset, true, true, false);
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setSectionPaint("One", new Color(160, 160, 255));
pieplot.setSectionPaint("Two", new Color(128, 128, 223));
pieplot.setSectionPaint("Three", new Color(96, 96, 191));
pieplot.setSectionPaint("Four", new Color(64, 64, 159));
pieplot.setSectionPaint("Five", new Color(32, 32, 127));
pieplot.setSectionPaint("Six", new Color(0, 0, 111));
pieplot.setNoDataMessage("No data available");
pieplot.setExplodePercent("Two", 0.5);
pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} ({2} percent)"));
pieplot.setLabelBackgroundPaint(new Color(220, 220, 220));
pieplot.setLegendLabelToolTipGenerator(new StandardPieSectionLabelGenerator("Tooltip for legend item {0}"));
return jfreechart;
}
```
程序代碼說明:
+ `setSectionPaint("One", new Color(160, 160, 255))`:設置某個片區的填充顏色。第一個參數為片區的標識,第二個參數為色值。
+ `setNoDataMessage("No data available")`:設置dataset為null時顯示的提示信息。
+ `setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({2} percent)"))`:設置標簽顯示的格式。
+ `setLabelBackgroundPaint(new Color(220, 220, 220))`:設置標簽的背景顏色。
+ `setLegendLabelToolTipGenerator(new StandardPieSectionLabelGenerator("Tooltip for legend item {0}"))`:設置鼠標滑過圖表是顯示鼠標當前片區的提示信息。
+ `pieplot.setExplodePercent("Two", 0.5)`:將第2個片區取出顯示。后面一個參數是取出的距離,是一個比例數。
### 5.10.4 類PieChartDemo3.java
功能:
顯示了dataset為空時,設置的提示信息。
效果:

代碼:
```
private static JFreeChart createChart(PieDataset piedataset) {
JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 3",
null, true, true, false);
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setNoDataMessage("沒有有效的數據顯示!");
pieplot.setNoDataMessageFont(new Font("黑體", 2, 20));
pieplot.setNoDataMessagePaint(Color.red);
return jfreechart;
}
```
程序代碼說明:
+ `setNoDataMessage("沒有有效的數據顯示!")`:設置提示信息內容。
+ `setNoDataMessageFont(new Font("Serif", 2, 10))`:設置提示信息的字體和大小。
+ `setNoDataMessagePaint(Color.red)`:設置提示信息字體的顏色。
### 5.10.5 類PieChartDemo4.java
功能:
帶有按鈕的圖表,通過對dataset的排序,可以改變片區的位置。
效果:

代碼:
```
public void actionPerformed(ActionEvent actionevent) {
String string = actionevent.getActionCommand();
if ("BY_KEY".equals(string)) {
if (!ascendingByKey) {
dataset.sortByKeys(SortOrder.ASCENDING);
ascendingByKey = true;
} else {
dataset.sortByKeys(SortOrder.DESCENDING);
ascendingByKey = false;
}
} else if ("BY_VALUE".equals(string)) {
if (!ascendingByValue) {
dataset.sortByValues(SortOrder.ASCENDING);
ascendingByValue = true;
} else {
dataset.sortByValues(SortOrder.DESCENDING);
ascendingByValue = false;
}
} else if ("RANDOM".equals(string)) {
ArrayList arraylist = new ArrayList(dataset.getKeys());
Collections.shuffle(arraylist);
DefaultPieDataset defaultpiedataset = new DefaultPieDataset();
Iterator iterator = arraylist.iterator();
while (iterator.hasNext()) {
Comparable comparable = (Comparable) iterator.next();
defaultpiedataset.setValue(comparable, dataset
.getValue(comparable));
}
PiePlot pieplot = (PiePlot) chart.getPlot();
pieplot.setDataset(defaultpiedataset);
dataset = defaultpiedataset;
}
}
```
程序代碼說明:
+ `dataset.sortByKeys(SortOrder.ASCENDING);`通過片區的關鍵值進行升序排序。
+ `dataset.sortByValues(SortOrder.DESCENDING);`通過片區的值進行降序排序。
### 5.10.6 類PieChartDemo5.java
功能:
右邊兩個餅圖為原形的,而左邊兩個為橢圓形的。
效果:

代碼:
```
public static JPanel createDemoPanel() {
JPanel jpanel = new JPanel(new GridLayout(2, 2));
DefaultPieDataset defaultpiedataset = new DefaultPieDataset();
defaultpiedataset.setValue("Section 1", 23.3);
defaultpiedataset.setValue("Section 2", 56.5);
defaultpiedataset.setValue("Section 3", 43.3);
defaultpiedataset.setValue("Section 4", 11.1);
//
JFreeChart jfreechart = ChartFactory.createPieChart("Chart 1",
defaultpiedataset, false, false, false);
jfreechart.addSubtitle(new TextTitle("setCircular(true);", new Font(
"Dialog", 0, 12)));
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setCircular(true);
//
JFreeChart jfreechart_0_ = ChartFactory.createPieChart("Chart 2",
defaultpiedataset, false, false, false);
jfreechart_0_.addSubtitle(new TextTitle("setCircular(false);",
new Font("Dialog", 0, 12)));
PiePlot pieplot_1_ = (PiePlot) jfreechart_0_.getPlot();
pieplot_1_.setCircular(false);
//
JFreeChart jfreechart_2_ = ChartFactory.createPieChart3D("Chart 3",
defaultpiedataset, false, false, false);
jfreechart_2_.addSubtitle(new TextTitle("setCircular(true);", new Font(
"Dialog", 0, 12)));
PiePlot3D pieplot3d = (PiePlot3D) jfreechart_2_.getPlot();
pieplot3d.setForegroundAlpha(0.6F);
pieplot3d.setCircular(true);
//
JFreeChart jfreechart_3_ = ChartFactory.createPieChart3D("Chart 4",
defaultpiedataset, false, false, false);
jfreechart_3_.addSubtitle(new TextTitle("setCircular(false);",
new Font("Dialog", 0, 12)));
PiePlot3D pieplot3d_4_ = (PiePlot3D) jfreechart_3_.getPlot();
pieplot3d_4_.setForegroundAlpha(0.6F);
pieplot3d_4_.setCircular(false);
jpanel.add(new ChartPanel(jfreechart));
jpanel.add(new ChartPanel(jfreechart_0_));
jpanel.add(new ChartPanel(jfreechart_2_));
jpanel.add(new ChartPanel(jfreechart_3_));
jpanel.setPreferredSize(new Dimension(800, 600));
return jpanel;
}
```
程序代碼說明:
+ `pieplot.setCircular(true)`:設置餅圖為圓形。
+ `jpanel.add`方法可以添加多個圖形的panel
### 5.10.7 類PieChartDemo6.java
功能:
顯示餅圖對零值和null值的處理。
效果:

代碼:
```
public static JPanel createDemoPanel() {
JPanel jpanel = new JPanel(new GridLayout(2, 2));
JFreeChart jfreechart = createChart("Pie Chart 1", createDataset());
Font font = new Font("Dialog", 0, 12);
jfreechart.addSubtitle(new TextTitle(
"Ignore nulls: false; Ignore zeros: false;", font));
JFreeChart jfreechart_0_ = createChart("Pie Chart 2", createDataset());
jfreechart_0_.addSubtitle(new TextTitle(
"Ignore nulls: true; Ignore zeros: false;", font));
PiePlot pieplot = (PiePlot) jfreechart_0_.getPlot();
pieplot.setIgnoreNullValues(true);
pieplot.setIgnoreZeroValues(false);
JFreeChart jfreechart_1_ = createChart("Pie Chart 3", createDataset());
jfreechart_1_.addSubtitle(new TextTitle(
"Ignore nulls: false; Ignore zeros: true;", font));
PiePlot pieplot_2_ = (PiePlot) jfreechart_1_.getPlot();
pieplot_2_.setIgnoreNullValues(false);
pieplot_2_.setIgnoreZeroValues(true);
JFreeChart jfreechart_3_ = createChart("Pie Chart 4", createDataset());
jfreechart_3_.addSubtitle(new TextTitle(
"Ignore nulls: true; Ignore zeros: true;", font));
PiePlot pieplot_4_ = (PiePlot) jfreechart_3_.getPlot();
pieplot_4_.setIgnoreNullValues(true);
pieplot_4_.setIgnoreZeroValues(true);
jpanel.add(new ChartPanel(jfreechart));
jpanel.add(new ChartPanel(jfreechart_0_));
jpanel.add(new ChartPanel(jfreechart_1_));
jpanel.add(new ChartPanel(jfreechart_3_));
return jpanel;
}
```
程序代碼說明:
+ `pieplot.setIgnoreNullValues(true)`:設置餅圖忽略null值,即是null值將不顯示。
+ `pieplot.setIgnoreZeroValues(false);`設置餅圖不忽略零值。即圖表中顯示出零值。
### 5.10.8 類PieChartDemo7.java
功能:
圖表能夠旋轉,標簽也隨之移動。
效果:

代碼:
```
public static JPanel createDemoPanel() {
PieDataset piedataset = createDataset(14);
JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 7",
piedataset, false, true, false);
jfreechart.setBackgroundPaint(new Color(222, 222, 255));
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setBackgroundPaint(Color.white);
pieplot.setCircular(true);
pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0} = {2}", NumberFormat.getNumberInstance(), NumberFormat
.getPercentInstance()));
pieplot.setNoDataMessage("No data available");
ChartPanel chartpanel = new ChartPanel(jfreechart);
chartpanel.setPreferredSize(new Dimension(500, 270));
Rotator rotator = new Rotator(pieplot);
rotator.start();
return chartpanel;
}
```
程序代碼說明:
+ 使用Rotator對象,旋轉餅圖。代碼如上。
### 5.10.9 類PieChartDemo8.java
功能:
編寫自定義標簽產生器,將Two標簽不顯示。
效果:

代碼:
```
private static JFreeChart createChart(PieDataset piedataset) {
JFreeChart jfreechart = ChartFactory.createPieChart("Pie Chart Demo 8",
piedataset, false, true, false);
PiePlot pieplot = (PiePlot) jfreechart.getPlot();
pieplot.setLabelGenerator(new CustomLabelGenerator());
return jfreechart;
}
static class CustomLabelGenerator implements PieSectionLabelGenerator {
public String generateSectionLabel(PieDataset piedataset,
Comparable comparable) {
String string = null;
if (piedataset != null && !comparable.equals("Two"))
string = comparable.toString();
return string;
}
public AttributedString generateAttributedSectionLabel(
PieDataset piedataset, Comparable comparable) {
Object object = null;
String string = comparable.toString();
String string_0_ = (string + " : " + String.valueOf(piedataset
.getValue(comparable)));
AttributedString attributedstring = new AttributedString(string_0_);
attributedstring.addAttribute(TextAttribute.WEIGHT,
TextAttribute.WEIGHT_BOLD, 0, string.length() - 1);
return attributedstring;
}
}
```
程序代碼說明:
+ 自定義`CustomLabelGenerator`,必須實現接口`PieSectionLabelGenerator`。
### 5.10.10 類PieChart3DDemo1.java
功能:
3D效果的餅圖。
效果:

代碼:
```
private static JFreeChart createChart(PieDataset piedataset) {
JFreeChart jfreechart = ChartFactory.createPieChart3D(
"Pie Chart 3D Demo 1", piedataset, true, true, false);
PiePlot3D pieplot3d = (PiePlot3D) jfreechart.getPlot();
pieplot3d.setStartAngle(180.0);
pieplot3d.setDirection(Rotation.CLOCKWISE);
pieplot3d.setForegroundAlpha(0.5F);
pieplot3d.setNoDataMessage("No data to display");
return jfreechart;
}
```
程序代碼說明:
+ 使用`ChartFactory`的方法`createPieChart3D`創建3D效果的餅圖。
+ `setStartAngle(180.0)`:設置旋轉角度。
+ `setDirection(Rotation.CLOCKWISE)`:設置旋轉方向,`Rotation.CLOCKWISE`為順時針。
+ `setForegroundAlpha(0.5F)`:設置圖表透明圖0.0~1.0范圍。0.0為完全透明,1.0為完全不透明。
### 5.10.11 類MultiplePieChartDemo1.java
功能:
使用CategoryDataset數據集,在一個圖表上產生多個餅圖。
效果:

代碼:
```
private static CategoryDataset createDataset() {
double[][] ds = { { 3.0, 4.0, 3.0, 5.0 }, { 5.0, 7.0, 6.0, 8.0 },
{ 5.0, 7.0, Double.NaN, 3.0 }, { 1.0, 2.0, 3.0, 4.0 },
{ 2.0, 3.0, 2.0, 3.0 } };
CategoryDataset categorydataset = DatasetUtilities
.createCategoryDataset("Region ", "Sales/Q", ds);
return categorydataset;
}
```
程序代碼說明:
+ 創建`CategoryDataset`的方法。
```
private static JFreeChart createChart(CategoryDataset categorydataset) {
JFreeChart jfreechart = ChartFactory.createMultiplePieChart(
"Multiple Pie Chart", categorydataset, TableOrder.BY_ROW, true, true, false);
MultiplePiePlot multiplepieplot = (MultiplePiePlot) jfreechart .getPlot();
JFreeChart jfreechart_0_ = multiplepieplot.getPieChart();
PiePlot pieplot = (PiePlot) jfreechart_0_.getPlot();
pieplot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}"));
pieplot.setLabelFont(new Font("SansSerif", 0, 8));
pieplot.setInteriorGap(0.3);
return jfreechart;
}
```
程序代碼說明:
+ 使用`ChartFactory`的方法`createMultiplePieChart()`創建多個餅圖的圖表。
+ `multiplepieplot.getPieChart()`:獲得單個餅圖的圖表。
- 1 簡介
- 1.1 什么是JFreeChart
- 1.2 使用文檔
- 1.3 感謝
- 1.4 建議
- 2 圖表實例
- 2.1 介紹
- 2.2 餅圖(Pie Charts)
- 2.3 直方條形圖(Bar Charts)
- 2.4 折線圖(Line Charts)
- 2.5 XY(散點圖)
- 2.6 時序圖
- 2.7 柱狀圖
- 2.8 面積圖
- 2.9 差異圖
- 2.10 梯形圖
- 2.11 甘特圖
- 2.12 多軸圖
- 2.13 復合/覆蓋圖
- 2.14 開發遠景
- 3 下載和安裝JFreeChart 1.0.6
- 3.1 簡介
- 3.2 下載
- 3.3 解包
- 3.4 運行演示實例
- 3.5 編譯源代碼
- 3.6 產生javadoc文檔
- 4 使用JFreeChart1.0.6
- 4.1 概述
- 4.2 創建第一個圖表
- 5 餅圖(Pie Charts)
- 5.1 簡介
- 5.2 創建一個簡單的餅圖(Pie Charts)
- 5.3 片區顏色
- 5.4 片區外廓
- 5.5 空置、零值和負值
- 5.6 片區和圖例標簽
- 5.7 “取出”某個片區
- 5.8 3D餅圖
- 5.9 多餅圖
- 5.10 實例講解
- 6 直方條形圖(Bar Charts)
- 6.1 簡介
- 6.2 創建一個直方條形圖
- 6.3 ChartFactory類
- 6.4 直方條形圖的簡單定制
- 6.5 定制外觀
- 6.6 示例代碼解讀
- 7 折線圖
- 7.1 簡介
- 7.2 使用categoryDataset數據集創建折線圖
- 7.3 使用XYDataset數據集創建折線圖
- 8 時序圖
- 8.1 簡介
- 8.2 創建時序圖
- 9 定制圖表(Customising Charts)
- 9.1 簡介
- 9.2 圖表屬性
- 9.3 圖區屬性
- 9.4 軸屬性
- 9.5 心得體會
- 10 動態圖(Dynamic Charts)
- 10.1 簡介
- 10.2 知識背景
- 10.3 實例應用
- 11 圖表工具條(Tooltips)
- 11.1 概述
- 11.2 創建圖表工具條
- 11.3 收集圖表工具條
- 11.4 顯示圖表工具條
- 11.5 隱藏圖表工具條
- 11.6 定制圖表工具條
- 12 圖表條目標簽(Item Label)
- 12.1 簡介
- 12.2 顯示條目標簽
- 12.3 條目標簽外觀
- 12.4 條目標簽位置
- 12.5 定制條目標簽文本
- 12.6 實例1
- 12.7 實例2
- 13 多軸和數據源圖表(Multi Axis and Dataset)
- 13.1 簡介
- 13.2 實例
- 13.3 建議和技巧
- 14 組合圖表(Combined Charts)
- 14.1 簡介
- 14.2 組合X種類圖區
- 14.3 組合Y種類圖區
- 14.4 組合X-XY圖區
- 14.5 組合Y-XY圖區
- 15 數據源和JDBC(Dataset And JDBC)
- 15.1 簡介
- 15.2 關于JDBC
- 15.3 樣本數據
- 15.4 PostgreSQL
- 15.5 JDBC驅動
- 15.6 應用演示
- 16 導出圖表為PDF格式
- 16.1 簡介
- 16.2 什么是Acrobat PDF
- 16.3 IText
- 16.4 Graphics2D
- 16.5 開始導出
- 16.6 實例應用
- 16.7 查看PDF 文件
- 16.8 Unicode字符問題
- 17 導出圖表為SVG格式
- 17.1 簡介
- 17.2 背景
- 17.3 實例代碼
- 18 Applet
- 18.1 簡介
- 18.2 問題
- 18.3 實例應用
- 19 Servlets
- 19.1 介紹
- 19.2 編寫一個簡單的Servlet應用
- 19.3 編譯實例Servlet
- 19.4 部署實例Servlet
- 19.5 在HMTL頁面種嵌入圖表
- 19.6 支持文件
- 19.7 部署Servlets
- 20 JFreeChart相關技術
- 20.1 簡介
- 20.2 X11/Headless Java
- 20.3 JSP
- 20.4 加載圖片
- 21 包
- 21.1 概述