Невозможно отобразить центральный текст в кольцевой диаграмме - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь создать кольцевую или кольцевую диаграмму, используя библиотеку диаграмм 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

1 Ответ

2 голосов
/ 19 июня 2019

Непонятно, куда движется ваш фрагмент, но этот минимально полный пример дает ожидаемый результат.Кроме того, обратите внимание на использование Font.BOLD для ясности и использование deriveFont() для минимизации риска неудачной замены шрифта ;см. также Исходные темы .

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

ring plot with value

Я пытался pie.setCenterText("Vijay");

вместо CenterTextMode.VALUE;укажите CenterTextMode.FIXED:

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

ring plot with fixed text

Приведенный выше код не устанавливает никаких значений, если первое значение набора данных равно нулю.

Правильно.RingPlot::drawItem() игнорирует центральный текст, если значения не превышают порог рендеринга;Вы можете указать значение, которое превышает пороговое значение, но отображается правильно при форматировании:

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

ring plot zero

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", new Integer(42));
        dataset.setValue("Important", new Integer(21));
        dataset.setValue("Moderate", new Integer(7));
        dataset.setValue("Low", new Integer(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);
    }
}
...