好吧,我让它按照我的客户的要求工作。
首先,您需要创建一种新的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);
就是这样。
结果 :