如何使用JFreeChart和JasperSoft在3D饼图中同时显示简单和扩展标签
JFreeChart 3D饼图同时显示双标签解决方案
原生PiePlot3D的setSimpleLabels方法确实只能二选一开启一种标签模式,要同时实现扇区顶部百分比、侧边分类名两种标签,可以通过自定义绘制逻辑实现,具体步骤如下:
实现步骤
- 第一步:基础配置先开启简单标签模式,将简单标签的生成器设置为仅输出百分比
PiePlot3D plot = (PiePlot3D) chart.getPlot(); // 开启简单标签(扇区顶部显示) plot.setSimpleLabels(true); // 自定义简单标签生成器,仅返回百分比 plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} {2}") { @Override public String generateSectionLabel(PieDataset dataset, Comparable key) { // 可按需调整百分比输出格式 return super.generateSectionLabel(dataset, key).split(" ")[1]; } }); // 调整简单标签样式,避免和外部标签重叠 plot.setLabelFont(new Font("宋体", Font.PLAIN, 12)); plot.setLabelPaint(Color.BLACK);
- 第二步:重写Plot的draw方法,额外绘制侧边的分类名标签
plot = new PiePlot3D(dataset) { @Override protected void drawItem(Graphics2D g2, int section, Rectangle2D dataArea, PiePlotState state, int currentPass) { super.drawItem(g2, section, dataArea, state, currentPass); // 只在最后一次绘制阶段添加自定义标签 if (currentPass == getPassCount() - 1) { PieDataset dataset = getDataset(); Comparable key = dataset.getKey(section); // 复用原生非简单标签模式的位置计算逻辑获取侧边标签坐标 Point2D labelLocation = calculateLabelLocation(section, dataArea, state); if (labelLocation != null) { // 绘制分类名标签,样式可自行调整 g2.setFont(new Font("宋体", Font.PLAIN, 12)); g2.setPaint(Color.DARK_GRAY); g2.drawString(key.toString(), (float) labelLocation.getX(), (float) labelLocation.getY()); // 如需添加标签指引线,可在此处补充绘制逻辑 } } } };
- 第三步:JasperSoft适配
如果是在JasperSoft中使用,可自定义JFreeChart定制器类,实现JRChartCustomizer接口,将上述逻辑写到定制器的customize方法中,再在报表模板的Chart组件中绑定该定制器即可生效。
内容的提问来源于stack exchange,提问作者ITIB
相关产品推荐
相关产品推荐

