JFreeChart画雷达图、带刻度雷达图、蜘蛛网、带刻度蜘蛛网(转自:http://blog.csdn.net/guoquanyou/archive/2008/12/10/3488313.aspx)
2011-06-02 22:48
701 查看
画雷达图
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
SpiderWebPlot spiderwebplot = new SpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
蜘蛛网
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
String group2 = "orange ";
dataset.addValue(3, group2, "w1");
dataset.addValue(3, group2, "w2");
dataset.addValue(4, group2, "w3");
dataset.addValue(7, group2, "w4");
dataset.addValue(4, group2, "w5");
dataset.addValue(5, group2, "w6");
dataset.addValue(3, group2, "w7");
dataset.addValue(3, group2, "w8");
String group3 = "banana ";
dataset.addValue(4, group3, "w1");
dataset.addValue(5, group3, "w2");
dataset.addValue(2, group3, "w3");
dataset.addValue(5, group3, "w4");
dataset.addValue(6, group3, "w5");
dataset.addValue(6, group3, "w6");
dataset.addValue(4, group3, "w7");
dataset.addValue(4, group3, "w8");
SpiderWebPlot spiderwebplot = new SpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
带刻度问题比较复杂,JFreeChart本身没有提供其功能,需要继承SpiderWebPlot,覆盖drawLabel方法。
此处代码参考Jerry代码,友情感谢。
MySpriderWebPlotTest出自“王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/116845
/**
* @本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处 http://wangjierui.blog.51cto.com/186879/116845
*/
public class MySpiderWebPlot extends SpiderWebPlot {
private int ticks = DEFAULT_TICKS;
private static final int DEFAULT_TICKS = 5;
private NumberFormat format = NumberFormat.getInstance();
private static final double PERPENDICULAR = 90;
private static final double TICK_SCALE = 0.015;
private int valueLabelGap = DEFAULT_GAP;
private static final int DEFAULT_GAP = 10;
private static final double THRESHOLD = 15;
MySpiderWebPlot(CategoryDataset createCategoryDataset) {
super(createCategoryDataset);
}
@Override
protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value,
final int cat, final double startAngle, final double extent) {
super.drawLabel(g2, plotArea, value, cat, startAngle, extent);
final FontRenderContext frc = g2.getFontRenderContext();
final double[] transformed = new double[2];
final double[] transformer = new double[2];
final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);
for (int i = 1; i <= ticks; i++) {
final Point2D point1 = arc1.getEndPoint();
final double deltaX = plotArea.getCenterX();
final double deltaY = plotArea.getCenterY();
double labelX = point1.getX() - deltaX;
double labelY = point1.getY() - deltaY;
final double scale = ((double) i / (double) ticks);
final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);
final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);
transformer[0] = labelX;
transformer[1] = labelY;
pointTrans.transform(transformer, 0, transformed, 0, 1);
final double pointX = transformed[0] + deltaX;
final double pointY = transformed[1] + deltaY;
tx.transform(transformer, 0, transformed, 0, 1);
labelX = transformed[0] + deltaX;
labelY = transformed[1] + deltaY;
double rotated = (PERPENDICULAR);
AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
transformer[0] = pointX;
transformer[1] = pointY;
rotateTrans.transform(transformer, 0, transformed, 0, 1);
final double x1 = transformed[0];
final double y1 = transformed[1];
rotated = (-PERPENDICULAR);
rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
rotateTrans.transform(transformer, 0, transformed, 0, 1);
final Composite saveComposite = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));
if (startAngle == this.getStartAngle()) {
final String label = format.format(((double) i / (double) ticks) * this.getMaxValue());
final Rectangle2D labelBounds = getLabelFont().getStringBounds(label, frc);
final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);
final double ascent = lm.getAscent();
if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {
labelX += valueLabelGap;
labelY += ascent / (float) 2;
} else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {
labelY += valueLabelGap;
} else if (labelX >= plotArea.getCenterX()) {
if (labelY < plotArea.getCenterY()) {
labelX += valueLabelGap;
labelY += valueLabelGap;
} else {
labelX -= valueLabelGap;
labelY += valueLabelGap;
}
} else {
if (labelY > plotArea.getCenterY()) {
labelX -= valueLabelGap;
labelY -= valueLabelGap;
} else {
labelX += valueLabelGap;
labelY -= valueLabelGap;
}
}
g2.setPaint(getLabelPaint());
g2.setFont(getLabelFont());
g2.drawString(label, (float) labelX, (float) labelY);
}
g2.setComposite(saveComposite);
}
}
}
带刻度雷达图
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
带刻度蜘蛛网
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
String group2 = "orange ";
dataset.addValue(3, group2, "w1");
dataset.addValue(3, group2, "w2");
dataset.addValue(4, group2, "w3");
dataset.addValue(7, group2, "w4");
dataset.addValue(4, group2, "w5");
dataset.addValue(5, group2, "w6");
dataset.addValue(3, group2, "w7");
dataset.addValue(3, group2, "w8");
String group3 = "banana ";
dataset.addValue(4, group3, "w1");
dataset.addValue(5, group3, "w2");
dataset.addValue(2, group3, "w3");
dataset.addValue(5, group3, "w4");
dataset.addValue(6, group3, "w5");
dataset.addValue(6, group3, "w6");
dataset.addValue(4, group3, "w7");
dataset.addValue(4, group3, "w8");
MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
SpiderWebPlot spiderwebplot = new SpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
蜘蛛网
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
String group2 = "orange ";
dataset.addValue(3, group2, "w1");
dataset.addValue(3, group2, "w2");
dataset.addValue(4, group2, "w3");
dataset.addValue(7, group2, "w4");
dataset.addValue(4, group2, "w5");
dataset.addValue(5, group2, "w6");
dataset.addValue(3, group2, "w7");
dataset.addValue(3, group2, "w8");
String group3 = "banana ";
dataset.addValue(4, group3, "w1");
dataset.addValue(5, group3, "w2");
dataset.addValue(2, group3, "w3");
dataset.addValue(5, group3, "w4");
dataset.addValue(6, group3, "w5");
dataset.addValue(6, group3, "w6");
dataset.addValue(4, group3, "w7");
dataset.addValue(4, group3, "w8");
SpiderWebPlot spiderwebplot = new SpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
带刻度问题比较复杂,JFreeChart本身没有提供其功能,需要继承SpiderWebPlot,覆盖drawLabel方法。
此处代码参考Jerry代码,友情感谢。
MySpriderWebPlotTest出自“王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/116845
/**
* @本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处 http://wangjierui.blog.51cto.com/186879/116845
*/
public class MySpiderWebPlot extends SpiderWebPlot {
private int ticks = DEFAULT_TICKS;
private static final int DEFAULT_TICKS = 5;
private NumberFormat format = NumberFormat.getInstance();
private static final double PERPENDICULAR = 90;
private static final double TICK_SCALE = 0.015;
private int valueLabelGap = DEFAULT_GAP;
private static final int DEFAULT_GAP = 10;
private static final double THRESHOLD = 15;
MySpiderWebPlot(CategoryDataset createCategoryDataset) {
super(createCategoryDataset);
}
@Override
protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value,
final int cat, final double startAngle, final double extent) {
super.drawLabel(g2, plotArea, value, cat, startAngle, extent);
final FontRenderContext frc = g2.getFontRenderContext();
final double[] transformed = new double[2];
final double[] transformer = new double[2];
final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);
for (int i = 1; i <= ticks; i++) {
final Point2D point1 = arc1.getEndPoint();
final double deltaX = plotArea.getCenterX();
final double deltaY = plotArea.getCenterY();
double labelX = point1.getX() - deltaX;
double labelY = point1.getY() - deltaY;
final double scale = ((double) i / (double) ticks);
final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);
final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);
transformer[0] = labelX;
transformer[1] = labelY;
pointTrans.transform(transformer, 0, transformed, 0, 1);
final double pointX = transformed[0] + deltaX;
final double pointY = transformed[1] + deltaY;
tx.transform(transformer, 0, transformed, 0, 1);
labelX = transformed[0] + deltaX;
labelY = transformed[1] + deltaY;
double rotated = (PERPENDICULAR);
AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
transformer[0] = pointX;
transformer[1] = pointY;
rotateTrans.transform(transformer, 0, transformed, 0, 1);
final double x1 = transformed[0];
final double y1 = transformed[1];
rotated = (-PERPENDICULAR);
rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);
rotateTrans.transform(transformer, 0, transformed, 0, 1);
final Composite saveComposite = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));
g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));
if (startAngle == this.getStartAngle()) {
final String label = format.format(((double) i / (double) ticks) * this.getMaxValue());
final Rectangle2D labelBounds = getLabelFont().getStringBounds(label, frc);
final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);
final double ascent = lm.getAscent();
if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {
labelX += valueLabelGap;
labelY += ascent / (float) 2;
} else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {
labelY += valueLabelGap;
} else if (labelX >= plotArea.getCenterX()) {
if (labelY < plotArea.getCenterY()) {
labelX += valueLabelGap;
labelY += valueLabelGap;
} else {
labelX -= valueLabelGap;
labelY += valueLabelGap;
}
} else {
if (labelY > plotArea.getCenterY()) {
labelX -= valueLabelGap;
labelY -= valueLabelGap;
} else {
labelX += valueLabelGap;
labelY -= valueLabelGap;
}
}
g2.setPaint(getLabelPaint());
g2.setFont(getLabelFont());
g2.drawString(label, (float) labelX, (float) labelY);
}
g2.setComposite(saveComposite);
}
}
}
带刻度雷达图
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
带刻度蜘蛛网
/**
* @作者:Jcuckoo
* @日期:2008-12-9
* @版本:V 1.0
*/
public class MySpriderWebPlotTest {
public static void main(String args[]) {
JFrame jf = new JFrame();
jf.add(erstelleSpinnenDiagramm());
jf.pack();
jf.setVisible(true);
}
public static JPanel erstelleSpinnenDiagramm() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String group1 = "apple ";
dataset.addValue(5, group1, "w1");
dataset.addValue(6, group1, "w2");
dataset.addValue(4, group1, "w3");
dataset.addValue(2, group1, "w4");
dataset.addValue(5, group1, "w5");
dataset.addValue(5, group1, "w6");
dataset.addValue(5, group1, "w7");
dataset.addValue(8, group1, "w8");
String group2 = "orange ";
dataset.addValue(3, group2, "w1");
dataset.addValue(3, group2, "w2");
dataset.addValue(4, group2, "w3");
dataset.addValue(7, group2, "w4");
dataset.addValue(4, group2, "w5");
dataset.addValue(5, group2, "w6");
dataset.addValue(3, group2, "w7");
dataset.addValue(3, group2, "w8");
String group3 = "banana ";
dataset.addValue(4, group3, "w1");
dataset.addValue(5, group3, "w2");
dataset.addValue(2, group3, "w3");
dataset.addValue(5, group3, "w4");
dataset.addValue(6, group3, "w5");
dataset.addValue(6, group3, "w6");
dataset.addValue(4, group3, "w7");
dataset.addValue(4, group3, "w8");
MySpiderWebPlot spiderwebplot = new MySpiderWebPlot(dataset);
JFreeChart jfreechart = new JFreeChart("Test", TextTitle.DEFAULT_FONT,spiderwebplot, false);
LegendTitle legendtitle = new LegendTitle(spiderwebplot);
legendtitle.setPosition(RectangleEdge.BOTTOM);
jfreechart.addSubtitle(legendtitle);
ChartPanel chartpanel = new ChartPanel(jfreechart);
return chartpanel;
}
}
相关文章推荐
- 转:超级实用且不花哨的js代码大全(http://blog.csdn.net/panxuan/archive/2007/11/26/1902826.aspx)
- ASP.net输出JS脚步的类(无AJAX框架)(原作者发布地址http://blog.csdn.net/zhoufoxcn/archive/2008/04/21/2312440.aspx)
- c#读取并修改App.config文件实例(转载:http://blog.csdn.net/abuhome/archive/2010/01/13/5184467.aspx)
- svn 中tag branch trunk 的用法(转自:http://blog.csdn.net/mqboss/archive/2010/10/22/5958225.aspx)
- http://blog.csdn.net/ezerg/archive/2004/10/24/149278.aspx
- CImageList使用指南(http://blog.csdn.net/panfei10000/archive/2006/12/21/1452278.aspx)
- eclipse_plugin(http://blog.csdn.net/chrython/archive/2006/10/29/1355453.aspx)
- http://blog.csdn.net/web518/archive/2005/04/21/356322.aspx
- 字符编码的奥秘(转自http://blog.csdn.net/hbrqlpf/archive/2007/09/24/1798935.aspx)
- 事务管理最佳实践全面解析(转)http://blog.csdn.net/shendl/archive/2006/11/27/1415958.aspx
- gcc生成静态库和动态库(转自http://blog.csdn.net/ast_224/archive/2009/03/13/3988244.aspx)
- WebKit研究报告(转自http://blog.csdn.net/hou_jiong/archive/2009/01/18/3831022.aspx)
- 命令行下管理本机或远程主机服务的工具 - SC命令简介(转http://blog.csdn.net/happywqw/archive/2005/10/26/517156.aspx)
- ASP.net输出JS脚步的类(无AJAX框架)(原作者发布地址http://blog.csdn.net/zhoufoxcn/archive/2008/04/21/2312440.aspx)
- group、grouping、rollup、cube的用法和区别(本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/junmail/archive/2006/12/26/1463132.aspx)
- Windows消息机制http://blog.csdn.net/weixu_2008/archive/2007/09/15/1785939.aspx
- window.event(转自:http://blog.csdn.net/cnkiminzhuhu/archive/2008/02/22/2112408.aspx)
- 如何将Web应用打包成.war文件? 转自:http://blog.csdn.net/code_JAVA/archive/2008/05/19/2457749.aspx
- IE和Firefox中Javascript和CSS的区别(轉:http://blog.csdn.net/superbeck/archive/2008/10/16/3082550.aspx)
- sql里的exists与in、not exists与not in的区别(转:http://blog.csdn.net/jkptthui/archive/2009/12/17/5024779.aspx)