首页 > 解决方案 > 无法在环形图中显示中心文本

问题描述

我正在尝试使用 jfree 图表库生成圆环图或环形图。环图已成功生成,但唯一的问题是环内的居中文本未显示。以下是示例片段。图表生成代码

JFreeChart chart = ChartFactory.createRingChart(heading, dataSet, legend, tooltips, urls);

和居中的文本相关代码如下

RingPlot pie = (RingPlot) chart.getPlot();
pie.setBackgroundPaint(Color.WHITE);
pie.setOutlineVisible(false);
pie.setShadowPaint(null);
pie.setLabelGenerator(null);
pie.setCenterTextMode(CenterTextMode.VALUE);
Font font = new Font("Arial",1,30);
pie.setCenterTextFont(font);
pie.setCenterTextColor(Color.getHSBColor(222, 1, 1));
pie.setSectionDepth(0.1);
pie.setSectionOutlinesVisible(false);
pie.setSeparatorsVisible(false);
pie.setIgnoreZeroValues(false);

我正在使用 jfreechart 版本 1.5.0

标签: javajfreechart

解决方案


目前尚不清楚您的片段在哪里出错,但这个最小的完整示例给出了预期的结果。Font.BOLD顺便说一句,为了清楚起见,请注意使用 ,deriveFont()以最大程度地减少不幸字体替换的风险;另见*初始线程*。

pie.setCenterTextMode(CenterTextMode.VALUE);
pie.setCenterTextFont(pie.getCenterTextFont().deriveFont(Font.BOLD, 30f));
pie.setCenterTextColor(Color.getHSBColor(0, 1, 1));

带值的环形图

我试过pie.setCenterText("Vijay");

而不是CenterTextMode.VALUE; 指定CenterTextMode.FIXED

pie.setCenterTextMode(CenterTextMode.FIXED);
pie.setCenterText("Vijay");

带有固定文本的环形图

如果第一个数据集值为零,则上述代码不会设置任何值。

正确的。RingPlot::drawItem()忽略中心文本,除非值超过呈现阈值;您可以指定一个通过阈值但在格式化时正确显示的值:

dataset.setValue("Critical", RingPlot.DEFAULT_MINIMUM_ARC_ANGLE_TO_DRAW);

环形图零

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CenterTextMode;
import org.jfree.chart.plot.RingPlot;
import org.jfree.data.general.DefaultPieDataset;

/**
 * @see https://stackoverflow.com/a/56672573/230513
 * @see https://stackoverflow.com/a/37414338/230513
 */
public class TestRing {

    private void display() {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue("Critical", Integer.valueOf(42));
        dataset.setValue("Important", Integer.valueOf(21));
        dataset.setValue("Moderate", Integer.valueOf(7));
        dataset.setValue("Low", Integer.valueOf(3));
        JFreeChart chart = ChartFactory.createRingChart(
            "Test", dataset, false, true, false);
        RingPlot pie = (RingPlot) chart.getPlot();
        pie.setSimpleLabels(true);
        pie.setCenterTextMode(CenterTextMode.VALUE);
        pie.setCenterTextFont(pie.getCenterTextFont().deriveFont(Font.BOLD, 30f));
        pie.setCenterTextColor(Color.getHSBColor(0, 1, 1));
        f.add(new ChartPanel(chart){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }
        });
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new TestRing()::display);
    }
}


推荐阅读