带换行符的JFree图表图例

时间:2012-04-27 14:57:54

标签: java java-ee jfreechart

我需要在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


修改

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

没关系,但是当我有很长的传说时: problem :'(

对于最后一张图片,我记录了我的传奇和断裂线,但它们没有显示jFree图表。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

好吧,我按照客户的意愿让它发挥作用。

首先,您需要制作一种新的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);

那就是它。

结果:

Final Result