[英]JFree Chart legend with line break
我需要在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图表。
要考虑两种选择:给出一个缩写的图例显示字符串,
使用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.