You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:18:03