我需要在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图表。
答案 0 :(得分:3)
要考虑的两种选择:给定缩写图例显示字符串
使用setLegendItemToolTipGenerator()
将完整,完整的字符串显示为工具提示。
renderer.setLegendItemToolTipGenerator(
new StandardXYSeriesLabelGenerator("Legend {0}"));
使用显示here的addChartMouseListener()
,并将图例上的鼠标移动事件转发到相邻的文本组件。
答案 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);
那就是它。
结果: