繁体   English   中英

带换行符的JFree图表图例

[英]JFree Chart legend with line break

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

无论如何,我试过“\\ n”,“\\ u2424”和“”。 它没有做任何事。 (从http://www.jfree.org/forum/viewtopic.php?f=3&t=10226http://www.jfree.org/forum/viewtopic.php?f=3&t=22417

我能找到的唯一解决方案(但我希望它可以避免,因为我希望它是动态完成的)是为每个图例修复一个宽度,所以它应该按我的需要打破。 编辑 :即使没有工作。

我正在使用jFree Chart 0.9.20


编辑

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

这很好,但是当我有很长的传说时: 问题:'(

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

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

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

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

好吧,我按照客户的意愿使它成功了。

首先,你需要制作一种新的Legend ,例如名为MyLegend (但请不要在现实世界中将其命名为)。

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

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

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

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

而已。

结果:

最后结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM