1

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

4

2 回答 2

3

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

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

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

于 2012-04-28T02:30:22.213 回答
1

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

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

该类需要扩展Legend 和实现Serializable,方法相同StandardLegend

老实说,我什至将整个复制/粘贴StandardLegendMyLegend. 然后,您可以将标准图例修改为您的自定义图例。

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

  • 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);

就是这样。

结果 :

最后结果

于 2012-05-03T09:09:15.997 回答