分类: Oracle
2008-04-23 17:37:48
/** * Create 3D pie chart displaying the number of employees at each * commission level.This method demonstrates use of DatasetReader to * translate data from XML format to JFreeChart data format. * * @return 3D Pie Chart showing number of employees at each commission * level. */ public JFreeChart createCommissionsPercentagePerLevelPieChart() { PieDataset pieData = null; final String xmlData = databaseAccess.getCommissionPercentageBreakdownAsXml(); final DatasetReader reader = new DatasetReader(); try { pieData = reader.readPieDatasetFromXML( new ByteArrayInputStream(xmlData.getBytes()) ); } catch (IOException ioEx) { ioEx.printStackTrace(); } JFreeChart chart = ChartFactory.createPieChart3D( "Commissioned Employees at Each Commission Level", pieData, false, true, false ); // Chart specifically provides getCategoryPlot() and getXYPlot() methods, // but not a getPiePlot() or getPiePlot3D() method. final PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setDepthFactor(0.35); // pie depth 35% of plot height plot.setForegroundAlpha(0.5f); // Declare explicitly as float (50%) plot.setLabelGenerator(new HrCommissionsPieGenerator()); return chart; } |
清单 18 中在 DatasetReader 上调用的方法是专为 PieDataset 实施设计的,方法名 (readPieDatasetFromXML) 证明了这一点。JFreeChart 的 DatasetReader 当前支持的另一个类型的数据集是 CategoryDataset(用于条形图、直线图等)。
清单 18 中的方法返回的 JFreeChart 实例的行为方式与在前面所有示例中显示的相同类的实例的行为方式相似。换言之,这个从 XML 输入数据生成 JFreeChart 可以保存为 PNG 或 JPEG 文件,可以在 Swing 应用程序中显示,可以在 servlet 或 JSP 页面中显示,甚至可以作为 SVG 图像或在 PDF 文件内显示。
图 15 显示了从清单 18 中生成的 JFreeChart 显示的 PNG。
图15:用XML源数据生成的三维饼形图 |
当您用数据库数据构建图表时,直接从数据库结果构建通常要比先转换为 XML 然后再构建数据集简单。这是因为 XML 生成会给该过程增添额外的步骤,而且易于使用的 JDBC 数据集支持的图表类型要比 XML 的 DatasetReader 支持的更多。DatasetReader 支持 PieDataset 和 CategoryDataset,同时除了用于饼形图的 JDBC 数据集 (JDBCPieDataset) 和用于类别图的 JDBC 数据集 (JDBCCategoryDataset) 之外,还有一个用于基于 x,y 的图表的 JDBC 数据集 (JDBCXYDataset)。
当要绘制成图表的数据在 XML 中“本机”可用时,JFreeChart 对 XML 输入数据的支持很有用。但是,即使这个时候,数据的格式也可能不是 JFreeChart 所期望的。因此,源 XML 数据需要通过 XSLT、XQuery 或自定义处理转换为期望的 XML 格式。此外,XML 支持提供了一种简单的方法,将用于图表生成的静态数据编写为可以轻松手动编辑然后用于构建图表的纯文本文件。
除了演示如何使用 XML 为通过 JFreeChart 生成图表提供数据外,该示例还演示了使用 JFreeChart 的其他自定义可能。在本示例中,检索了绘图的特定类型 (PiePlot3D)。该绘图继承自 PiePlot 并增加了一些特定于其三维特性的方法(如本示例中应用的深度设置)。然后,可以使用该 PiePlot3D 向饼块中添加一些透明性,以使饼块更深,并自定义饼块的标签。将图 15 中的输出与本文前面的饼形图相比较演示了该自定义如何影响最终图表。
清单 18 包括对 HrCommissionsPieGenerator 类的引用。该类(其定义如清单 18 所示)覆盖了生成的饼形图中的饼块的标签。
清单 19: 自定义饼形图标签
public class HrCommissionsPieGenerator implements PieSectionLabelGenerator { /** * Generates a customized label for a pie section of pie chart depicting * commissions levels. * * @param aDataset Dataset destined for pie chart. * @param aKey The identifying key for each section of the pie chart. * * @return Customized label for section of pie chart identified by aKey. */ public String generateSectionLabel(final PieDataset aDataset, final Comparable aKey) { String labelResult = null; if (aDataset != null) { labelResult = (int)(Double.parseDouble(aKey.toString())*100) + "% sales (" + aDataset.getValue(aKey).intValue() + " employees)"; } return labelResult; } } |
尽管我们提供了 9 个示例来演示 JFreeChart 的功能和灵活性,但还是有很多未尽之处。下一节概述本文没有重点描述的一些 JFreeChart 吸引人的特性。