在這里主要貼上JFreeChart做的兩個小例子,分別是柱狀圖和動態顯示JVM內存狀況圖。
先說明一下jfreechart的概念,jfreechart工具基本上把一個圖形分成了幾個邏輯部分:
1.首先是整個的畫布對象(chart),畫布就相當與一個大的容器,包含一些圖形元素,比如為一張白紙
2.然后是畫圖區域對象(plot),就是實際圖形所占據的區域,比如為白紙上的一個長方形
3.然后是圖形所需要兩條軸對象(axis),比如為白紙上的兩條軸線
4.最后是如何進行圖像的繪制對象(render),比如為一只畫圖的筆
5.除開上面的這些對象,還有一個最主要的就是通過必須的數據集(dataset)來生成圖形了
好了,其它的API就看文檔了。現在開始說開發JFreeChart例子的步驟:
1. 首先下載jfreechart包。
2. 接著用MyEclipse創建一個Java Project.
3. 引用包, 要加入的包是gnujaxp.jar, jfreechart-1.0.12.jar, jcommon-1.0.15.jar
這樣就把開發環境配好了,接下來就是創建類文件。先從柱狀圖開始.
運行后,可看到結果了。
接著下來是動態顯示JVM內存狀況圖的原碼.
祝你好運。
先說明一下jfreechart的概念,jfreechart工具基本上把一個圖形分成了幾個邏輯部分:
1.首先是整個的畫布對象(chart),畫布就相當與一個大的容器,包含一些圖形元素,比如為一張白紙
2.然后是畫圖區域對象(plot),就是實際圖形所占據的區域,比如為白紙上的一個長方形
3.然后是圖形所需要兩條軸對象(axis),比如為白紙上的兩條軸線
4.最后是如何進行圖像的繪制對象(render),比如為一只畫圖的筆
5.除開上面的這些對象,還有一個最主要的就是通過必須的數據集(dataset)來生成圖形了
好了,其它的API就看文檔了。現在開始說開發JFreeChart例子的步驟:
1. 首先下載jfreechart包。
2. 接著用MyEclipse創建一個Java Project.
3. 引用包, 要加入的包是gnujaxp.jar, jfreechart-1.0.12.jar, jcommon-1.0.15.jar
這樣就把開發環境配好了,接下來就是創建類文件。先從柱狀圖開始.
1 import java.io.FileOutputStream;
2
3 import org.jfree.chart.ChartFactory;
4 import org.jfree.chart.ChartUtilities;
5 import org.jfree.chart.JFreeChart;
6 import org.jfree.chart.plot.PlotOrientation;
7 import org.jfree.data.category.CategoryDataset;
8 import org.jfree.data.category.DefaultCategoryDataset;
9
10 public class BarChartDemo {
11 private static String rowKeys[] ={"Apple", "Banana", "Watermelon"};
12 private static String columnKeys[] ={"Guangzhou", "Shanghai", "Beijing"};
13 private static String rowKeys_zh_CN[] ={"蘋果", "香蕉", "西瓜"};
14 private static String columnKeys_zh_CN[] ={"廣州", "上海", "北京"};
15 /**
16 * @param args
17 */
18 public static void main(String[] args) {
19 CategoryDataset dataSet = getComplexDataSet();
20 JFreeChart chart = ChartFactory.createBarChart("Fruit Output Chart",// 圖表標題
21 "Fruit",// 目錄軸的顯示標簽
22 "Output",// 數值軸的顯示標簽
23 dataSet,// 數據集
24 PlotOrientation.VERTICAL,// 圖表方向:水平、垂直
25 true,// 是否顯示圖例(對于簡單的柱狀圖必須是false)
26 false,// 是否生成工具
27 false// 是否生成URL鏈接
28 );
29 FileOutputStream fosJPG = null;
30 try {
31 fosJPG = new FileOutputStream("D:\\fruit.jpg");
32 ChartUtilities.writeChartAsJPEG(fosJPG, chart, 400, 300);
33 } catch (Exception e) {
34 e.printStackTrace();
35 } finally {
36 try {
37 fosJPG.close();
38 } catch (Exception e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 /**
45 * 獲取一個演示用的簡單數據集對象
46 *
47 * @return
48 */
49 private static CategoryDataset getDataSet() {
50 DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();
51 categoryDataset.addValue(100, "", rowKeys[0]);
52 categoryDataset.addValue(200, "", rowKeys[1]);
53 categoryDataset.addValue(300, "", rowKeys[2]);
54 return categoryDataset;
55 }
56
57 /**
58 * 獲取一個演示用的組合數據集對象
59 *
60 * @return
61 */
62 private static CategoryDataset getComplexDataSet() {
63 DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();
64 categoryDataset.addValue(100, columnKeys[0], rowKeys[0]);
65 categoryDataset.addValue(110, columnKeys[1], rowKeys[0]);
66 categoryDataset.addValue(120, columnKeys[2], rowKeys[0]);
67 categoryDataset.addValue(200, columnKeys[0], rowKeys[1]);
68 categoryDataset.addValue(210, columnKeys[1], rowKeys[1]);
69 categoryDataset.addValue(220, columnKeys[2], rowKeys[1]);
70 categoryDataset.addValue(300, columnKeys[0], rowKeys[2]);
71 categoryDataset.addValue(310, columnKeys[1], rowKeys[2]);
72 categoryDataset.addValue(320, columnKeys[2], rowKeys[2]);
73 return categoryDataset;
74 }
75 }
76
2
3 import org.jfree.chart.ChartFactory;
4 import org.jfree.chart.ChartUtilities;
5 import org.jfree.chart.JFreeChart;
6 import org.jfree.chart.plot.PlotOrientation;
7 import org.jfree.data.category.CategoryDataset;
8 import org.jfree.data.category.DefaultCategoryDataset;
9
10 public class BarChartDemo {
11 private static String rowKeys[] ={"Apple", "Banana", "Watermelon"};
12 private static String columnKeys[] ={"Guangzhou", "Shanghai", "Beijing"};
13 private static String rowKeys_zh_CN[] ={"蘋果", "香蕉", "西瓜"};
14 private static String columnKeys_zh_CN[] ={"廣州", "上海", "北京"};
15 /**
16 * @param args
17 */
18 public static void main(String[] args) {
19 CategoryDataset dataSet = getComplexDataSet();
20 JFreeChart chart = ChartFactory.createBarChart("Fruit Output Chart",// 圖表標題
21 "Fruit",// 目錄軸的顯示標簽
22 "Output",// 數值軸的顯示標簽
23 dataSet,// 數據集
24 PlotOrientation.VERTICAL,// 圖表方向:水平、垂直
25 true,// 是否顯示圖例(對于簡單的柱狀圖必須是false)
26 false,// 是否生成工具
27 false// 是否生成URL鏈接
28 );
29 FileOutputStream fosJPG = null;
30 try {
31 fosJPG = new FileOutputStream("D:\\fruit.jpg");
32 ChartUtilities.writeChartAsJPEG(fosJPG, chart, 400, 300);
33 } catch (Exception e) {
34 e.printStackTrace();
35 } finally {
36 try {
37 fosJPG.close();
38 } catch (Exception e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 /**
45 * 獲取一個演示用的簡單數據集對象
46 *
47 * @return
48 */
49 private static CategoryDataset getDataSet() {
50 DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();
51 categoryDataset.addValue(100, "", rowKeys[0]);
52 categoryDataset.addValue(200, "", rowKeys[1]);
53 categoryDataset.addValue(300, "", rowKeys[2]);
54 return categoryDataset;
55 }
56
57 /**
58 * 獲取一個演示用的組合數據集對象
59 *
60 * @return
61 */
62 private static CategoryDataset getComplexDataSet() {
63 DefaultCategoryDataset categoryDataset = new DefaultCategoryDataset();
64 categoryDataset.addValue(100, columnKeys[0], rowKeys[0]);
65 categoryDataset.addValue(110, columnKeys[1], rowKeys[0]);
66 categoryDataset.addValue(120, columnKeys[2], rowKeys[0]);
67 categoryDataset.addValue(200, columnKeys[0], rowKeys[1]);
68 categoryDataset.addValue(210, columnKeys[1], rowKeys[1]);
69 categoryDataset.addValue(220, columnKeys[2], rowKeys[1]);
70 categoryDataset.addValue(300, columnKeys[0], rowKeys[2]);
71 categoryDataset.addValue(310, columnKeys[1], rowKeys[2]);
72 categoryDataset.addValue(320, columnKeys[2], rowKeys[2]);
73 return categoryDataset;
74 }
75 }
76
運行后,可看到結果了。
接著下來是動態顯示JVM內存狀況圖的原碼.
1 import java.awt.BasicStroke;
2 import java.awt.BorderLayout;
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.WindowAdapter;
8 import java.awt.event.WindowEvent;
9
10 import javax.swing.BorderFactory;
11 import javax.swing.JFrame;
12 import javax.swing.JPanel;
13 import javax.swing.Timer;
14
15 import org.jfree.chart.ChartPanel;
16 import org.jfree.chart.JFreeChart;
17 import org.jfree.chart.axis.DateAxis;
18 import org.jfree.chart.axis.NumberAxis;
19 import org.jfree.chart.plot.XYPlot;
20 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
21 import org.jfree.data.time.Millisecond;
22 import org.jfree.data.time.TimeSeries;
23 import org.jfree.data.time.TimeSeriesCollection;
24 import org.jfree.ui.RectangleInsets;
25
26 public class MemoryUsage extends JPanel {
27
28 class DataGenerator extends Timer implements ActionListener {
29
30 /*
31 * Invoked when an action occurs.
32 *
33 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
34 */
35 public void actionPerformed(ActionEvent actionevent) {
36 long free = Runtime.getRuntime().freeMemory();
37 long total = Runtime.getRuntime().totalMemory();
38 addTotalObservation(total);
39 addFreeObservation(free);
40 }
41
42 DataGenerator(int i) {
43 super(i, null);
44 addActionListener(this);
45 }
46 }
47
48 public MemoryUsage(int maxItemAge) {
49 super(new BorderLayout());
50 total = new TimeSeries("Total Memory",
51 org.jfree.data.time.Millisecond.class);
52 total.setMaximumItemAge(maxItemAge);
53 free = new TimeSeries("Free Memory",
54 org.jfree.data.time.Millisecond.class);
55 free.setMaximumItemAge(maxItemAge);
56
57 TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
58 timeseriescollection.addSeries(total);
59 timeseriescollection.addSeries(free);
60
61 DateAxis dateaxis = new DateAxis("Time");
62 NumberAxis numberaxis = new NumberAxis("Memory");
63 dateaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
64 numberaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
65 dateaxis.setLabelFont(new Font("SansSerif", 0, 14));
66 numberaxis.setLabelFont(new Font("SansSerif", 0, 14));
67 dateaxis.setAutoRange(true);
68 dateaxis.setLowerMargin(0.0D);
69 dateaxis.setUpperMargin(0.0D);
70 dateaxis.setTickLabelsVisible(true);
71 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
72
73 XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(
74 true, false);
75 xylineandshaperenderer.setSeriesPaint(0, Color.RED); // 改變第一個Series的顏色
76 xylineandshaperenderer.setSeriesPaint(1, Color.YELLOW);// 改變第二個Series的顏色
77 xylineandshaperenderer.setSeriesStroke(0, new BasicStroke(1F, 0, 2));
78 xylineandshaperenderer.setSeriesStroke(1, new BasicStroke(1F, 0, 2));
79
80 XYPlot xyplot = new XYPlot(timeseriescollection, dateaxis, numberaxis,
81 xylineandshaperenderer);
82 xyplot.setBackgroundPaint(Color.BLACK); // 改變背景顏色
83 xyplot.setDomainGridlinePaint(Color.white);
84 xyplot.setRangeGridlinePaint(Color.white);
85 xyplot.setAxisOffset(new RectangleInsets(1D, 1D, 1D, 1D));
86
87 JFreeChart jfreechart = new JFreeChart("JVM Memory Usage", new Font(
88 "SansSerif", 1, 24), xyplot, true);
89 jfreechart.setBackgroundPaint(Color.white);
90
91 ChartPanel chartpanel = new ChartPanel(jfreechart, true);
92 chartpanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
93 .createEmptyBorder(10, 10, 10, 10), BorderFactory
94 .createLineBorder(Color.black)));
95
96 add(chartpanel);
97 }
98
99 private void addTotalObservation(double d) {
100 total.add(new Millisecond(), d);
101 }
102
103 private void addFreeObservation(double d) {
104 free.add(new Millisecond(), d);
105 }
106
107 /**
108 * @param args
109 */
110 public static void main(String[] args) {
111 JFrame jframe = new JFrame("JVM Memory Usage");
112 MemoryUsage memoryusagedemo = new MemoryUsage(10000);
113 jframe.getContentPane().add(memoryusagedemo, "Center");
114 jframe.setBounds(200, 120, 1000, 500);
115 jframe.setVisible(true);
116 (memoryusagedemo.new DataGenerator(1000)).start();
117 jframe.addWindowListener(new WindowAdapter() {
118 public void windowClosing(WindowEvent windowevent) {
119 System.exit(0);
120 }
121 });
122 }
123
124 private TimeSeries total;
125 private TimeSeries free;
126 }
127
2 import java.awt.BorderLayout;
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.event.ActionEvent;
6 import java.awt.event.ActionListener;
7 import java.awt.event.WindowAdapter;
8 import java.awt.event.WindowEvent;
9
10 import javax.swing.BorderFactory;
11 import javax.swing.JFrame;
12 import javax.swing.JPanel;
13 import javax.swing.Timer;
14
15 import org.jfree.chart.ChartPanel;
16 import org.jfree.chart.JFreeChart;
17 import org.jfree.chart.axis.DateAxis;
18 import org.jfree.chart.axis.NumberAxis;
19 import org.jfree.chart.plot.XYPlot;
20 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
21 import org.jfree.data.time.Millisecond;
22 import org.jfree.data.time.TimeSeries;
23 import org.jfree.data.time.TimeSeriesCollection;
24 import org.jfree.ui.RectangleInsets;
25
26 public class MemoryUsage extends JPanel {
27
28 class DataGenerator extends Timer implements ActionListener {
29
30 /*
31 * Invoked when an action occurs.
32 *
33 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
34 */
35 public void actionPerformed(ActionEvent actionevent) {
36 long free = Runtime.getRuntime().freeMemory();
37 long total = Runtime.getRuntime().totalMemory();
38 addTotalObservation(total);
39 addFreeObservation(free);
40 }
41
42 DataGenerator(int i) {
43 super(i, null);
44 addActionListener(this);
45 }
46 }
47
48 public MemoryUsage(int maxItemAge) {
49 super(new BorderLayout());
50 total = new TimeSeries("Total Memory",
51 org.jfree.data.time.Millisecond.class);
52 total.setMaximumItemAge(maxItemAge);
53 free = new TimeSeries("Free Memory",
54 org.jfree.data.time.Millisecond.class);
55 free.setMaximumItemAge(maxItemAge);
56
57 TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
58 timeseriescollection.addSeries(total);
59 timeseriescollection.addSeries(free);
60
61 DateAxis dateaxis = new DateAxis("Time");
62 NumberAxis numberaxis = new NumberAxis("Memory");
63 dateaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
64 numberaxis.setTickLabelFont(new Font("SansSerif", 0, 12));
65 dateaxis.setLabelFont(new Font("SansSerif", 0, 14));
66 numberaxis.setLabelFont(new Font("SansSerif", 0, 14));
67 dateaxis.setAutoRange(true);
68 dateaxis.setLowerMargin(0.0D);
69 dateaxis.setUpperMargin(0.0D);
70 dateaxis.setTickLabelsVisible(true);
71 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
72
73 XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(
74 true, false);
75 xylineandshaperenderer.setSeriesPaint(0, Color.RED); // 改變第一個Series的顏色
76 xylineandshaperenderer.setSeriesPaint(1, Color.YELLOW);// 改變第二個Series的顏色
77 xylineandshaperenderer.setSeriesStroke(0, new BasicStroke(1F, 0, 2));
78 xylineandshaperenderer.setSeriesStroke(1, new BasicStroke(1F, 0, 2));
79
80 XYPlot xyplot = new XYPlot(timeseriescollection, dateaxis, numberaxis,
81 xylineandshaperenderer);
82 xyplot.setBackgroundPaint(Color.BLACK); // 改變背景顏色
83 xyplot.setDomainGridlinePaint(Color.white);
84 xyplot.setRangeGridlinePaint(Color.white);
85 xyplot.setAxisOffset(new RectangleInsets(1D, 1D, 1D, 1D));
86
87 JFreeChart jfreechart = new JFreeChart("JVM Memory Usage", new Font(
88 "SansSerif", 1, 24), xyplot, true);
89 jfreechart.setBackgroundPaint(Color.white);
90
91 ChartPanel chartpanel = new ChartPanel(jfreechart, true);
92 chartpanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
93 .createEmptyBorder(10, 10, 10, 10), BorderFactory
94 .createLineBorder(Color.black)));
95
96 add(chartpanel);
97 }
98
99 private void addTotalObservation(double d) {
100 total.add(new Millisecond(), d);
101 }
102
103 private void addFreeObservation(double d) {
104 free.add(new Millisecond(), d);
105 }
106
107 /**
108 * @param args
109 */
110 public static void main(String[] args) {
111 JFrame jframe = new JFrame("JVM Memory Usage");
112 MemoryUsage memoryusagedemo = new MemoryUsage(10000);
113 jframe.getContentPane().add(memoryusagedemo, "Center");
114 jframe.setBounds(200, 120, 1000, 500);
115 jframe.setVisible(true);
116 (memoryusagedemo.new DataGenerator(1000)).start();
117 jframe.addWindowListener(new WindowAdapter() {
118 public void windowClosing(WindowEvent windowevent) {
119 System.exit(0);
120 }
121 });
122 }
123
124 private TimeSeries total;
125 private TimeSeries free;
126 }
127
祝你好運。