Название легенды не отображается правильно в диаграмме - PullRequest
3 голосов
/ 18 октября 2019

Я создал гистограмму с помощью API JFreeChart v1.5.0 и добавил легенду с заголовком на диаграмму.

Я использовал пример из этой демонстрации гистограммы и добавил следующий код легендык примеру.

//Legend default properties
protected static final boolean LEGEND_ON = true;
private static final RectangleEdge LEGEND_POSITION = RectangleEdge.RIGHT;
private static final String LEGEND_TITLE_TEXT = "Legend";
private static final Font LEGEND_TITLE_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TITLE_COLOR = Color.BLACK;
private static final double LEGEND_MAX_WIDTH = 0.0;
private static final Color LEGEND_BG_COLOR = Color.WHITE;
private static final Color LEGEND_BORDER_COLOR = Color.WHITE;
private static final Font LEGEND_TEXT_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TEXT_COLOR = Color.BLACK;

LegendTitle legend = chart.getLegend();
legend.setPosition(LEGEND_POSITION);
legend.setWidth(LEGEND_MAX_WIDTH);
legend.setBackgroundPaint(LEGEND_BG_COLOR);
legend.setFrame(new BlockBorder(1, 1, 1, 1, LEGEND_BORDER_COLOR));
legend.setItemFont(LEGEND_TEXT_FORMAT);
legend.setItemPaint(LEGEND_TEXT_COLOR);

if (LEGEND_TITLE_TEXT != null) {
    TextTitle legendTitle = new TextTitle();
    legendTitle.setText(LEGEND_TITLE_TEXT);
    legendTitle.setPosition(LEGEND_POSITION);
    legendTitle.setPaint(LEGEND_TITLE_COLOR);
    legendTitle.setFont(LEGEND_TITLE_FORMAT);
    legendTitle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    legendTitle.setVerticalAlignment(VerticalAlignment.CENTER);
    chart.addSubtitle(1, legendTitle);
}

Когда я запускаю пример вместе с моим кодом легенды, я получаю следующий вывод:

Legend Title not upright

Я заметил, что заголовок легенды отображается неправильно, так как он расположен вертикально, а не горизонтально внутри контейнера легенды с правой стороны (как показано на рисунке ниже для ожидаемого результата). Я попытался сделать несколько шагов, таких как использование TextUtils.drawRotatedString () и TextUtils.drawAlignedString (), но не смог исправить положение заголовка легенды и ее выравнивание.

Как разместить заголовок легенды поверх контейнера легенды ивыровнять его по горизонтали?

Я ищу аналогичный вывод для заголовка легенды, как показано ниже, который был создан с использованием другой структуры диаграммы.

Expected Output for legend title

Я хотел бы выровнять и расположить заголовок моей легенды, как показано в выводе выше.

1 Ответ

1 голос
/ 13 ноября 2019

Основываясь на примере, приведенном в этой ссылке , я изменил код, добавив пользовательскую легенду, используя BlockContainer, чтобы получить желаемый результат, как показано на рисунке 1 из вопроса выше.

Обновленный код:

//Legend default properties
pro tected static final boolean LEGEND_ON = true;
private static final RectangleEdge LEGEND_POSITION = RectangleEdge.RIGHT;
private static final String LEGEND_TITLE_TEXT = "Legend";
private static final Font LEGEND_TITLE_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TITLE_COLOR = Color.BLACK;
private static final double LEGEND_MAX_WIDTH = 0.0;
private static final Color LEGEND_BG_COLOR = Color.WHITE;
private static final Color LEGEND_BORDER_COLOR = Color.WHITE;
private static final Font LEGEND_TEXT_FORMAT = new Font(Font.SANS_SERIF, Font.PLAIN, 12);
private static final Color LEGEND_TEXT_COLOR = Color.BLACK;

LegendTitle legend = chart.getLegend();
legend.setPosition(LEGEND_POSITION);
legend.setWidth(LEGEND_MAX_WIDTH);
legend.setBackgroundPaint(LEGEND_BG_COLOR);
legend.setFrame(new BlockBorder(1, 1, 1, 1, LEGEND_BORDER_COLOR));
legend.setItemFont(LEGEND_TEXT_FORMAT);
legend.setItemPaint(LEGEND_TEXT_COLOR);

if (LEGEND_TITLE_TEXT != null) {
    TextTitle legendTitle = new TextTitle();
    legendTitle.setText(LEGEND_TITLE_TEXT);
    legendTitle.setPosition(LEGEND_POSITION);
    legendTitle.setPaint(LEGEND_TITLE_COLOR);
    legendTitle.setFont(LEGEND_TITLE_FORMAT);
    legendTitle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    legendTitle.setVerticalAlignment(VerticalAlignment.CENTER);

    BlockContainer legendCont = new BlockContainer(new ColumnArrangement());
    legendCont.add(legendTitle, RectangleEdge.TOP);
    BlockContainer items = legend.getItemContainer();
    legendCont.add(items);      
    legend.setWrapper(legendCont);
    //Remove existing legend to avoid duplicate legend display.
    chart.removeLegend();
    //show legend container with title and items
    chart.addSubtitle(legend);
}

После выполнения вышеуказанного кода я получил следующий вывод:

Legend Title Position Upright

...