【问题标题】:JFree Chart legend with line break带有换行符的 JFree 图表图例
【发布时间】:2012-04-27 14:57:54
【问题描述】:

我需要在 JFree Chart 的某个图例中添加断线。 我有一些 316 个字符的传说,每 80 个字符需要打破。 最后,我将有 4 行。

无论如何,我尝试使用“\n”、“\u2424”和“ ”。它什么也没做。 (来自http://www.jfree.org/forum/viewtopic.php?f=3&t=10226 & http://www.jfree.org/forum/viewtopic.php?f=3&t=22417

我能找到的唯一解决方案(但我希望可以避免它,因为我希望它是动态完成的)是为每个图例固定一个宽度,所以它应该根据需要中断。罢工> 编辑:这甚至没有用。

我正在使用 jFree Chart 0.9.20


编辑

目前,有一个小传说,这就是我所拥有的:

没关系,但当我有我的长传说时:

对于最后一张图片,我记录了我的图例和折线,但它们没有显示在 jFree Chart 中。

【问题讨论】:

  • 我什至尝试了固定宽度......它没有工作:(
  • 交叉发布here

标签: java jakarta-ee jfreechart


【解决方案1】:

需要考虑的两种选择:给定一个缩写的图例显示字符串,

  • 使用setLegendItemToolTipGenerator() 将完整、完整的字符串显示为工具提示。

    renderer.setLegendItemToolTipGenerator(
        new StandardXYSeriesLabelGenerator("Legend {0}"));
    
  • 使用addChartMouseListener(),显示为here,并将图例上方的鼠标移动事件向前移动到相邻的文本组件。

【讨论】:

  • 后者有一个相关的例子here
  • 不是我真正要求的,而是对我的客户的一个很好的建议;-) 我会问他们对第二个的看法。他们拒绝了我的工具提示想法:(
  • 你有第一个例子的例子吗?毕竟他们可能会感兴趣。
  • 哦,如果我理解得很好,在每个解决方案中,您只考虑 1 个图例对吗?我每次至少有2个。我应该这么说的。我会更新我的问题。
  • 鼠标一次只能悬停在一个图例项上,每个图例项依次处理。版本 1.0.14 是当前版本。
【解决方案2】:

好的,我按照客户的要求让它工作了。

首先,您需要创建一种新的Legend,例如命名为MyLegend(但请不要在现实世界中这样命名)。

该类需要扩展Legend 并实现Serializable,就像StandardLegend 一样。

说实话,我什至将整个StandardLegend 复制/粘贴到MyLegend 中。 然后,您可以将标准图例修改为您的自定义图例。

为了我的需要,我改变了:

  • draw()整个Legend组的高宽计算
  • drawSeriesElements() 拆分图例的标签并将每一行绘制在另一行之下。

// Multi line management for Legend
String[] multiline = item.getItem().getLabel().split(System.getProperty("line.separator"));
for(int j = 0; j<multiline.length; j++) {
    RefineryUtilities.drawAlignedString(multiline[j], g2,
        (float) item.getLabelPosition().getX(), (float) item
        .getLabelPosition().getY() + g2.getFontMetrics().getHeight()*j, TextAnchor.CENTER_LEFT);
}
  • createDrawableLegendItem() 计算每个项目的宽度和高度。 因为,现在图例是多行的,所以一个项目的每一行的宽度与其他项目的宽度不同。我们需要找到最长的一个来定义项目的实际宽度。 身高也是一样。现在它是多行的,所以它需要计算它需要多少行才能知道项目的实际高度。

或者,您也可以更改 drawLegendTitle() 以使其成为多行。

根据需要配置该类后,您需要将其应用到图表上。

所以,你照常做:

JFreeChart chart = new JFreeChart(...);
chart.set ... // apply your series and options

MyLegend legend = new MyLegend();
legend.set... // apply your legend options if applicable
chart.setLegend(legend);

就是这样。

结果:

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多