JFreeChart 图例显示

7

在我的JFreeChart时间序列图中,我发现图例线条太细,很难准确看到颜色。另一篇文章 [ https://dev59.com/3VrUa4cB1Zd3GeqPo_VL ] 建议通过覆盖渲染器方法来解决:

renderer = new XYLineAndShapeRenderer()
{
    private static final long serialVersionUID = 1L;
    public Shape lookupLegendShape(int series)
    {
        return new Rectangle(15, 15);
    }
};

这种方法一直运行良好,直到你像我一样做了某些事情。

renderer.setSeriesShapesVisible(i, false);

我这样做后,图例会变成一条线。有没有什么解决方法?

我采用的解决方案接近于TrashGod所建议的方案,我覆盖了getLegendItem()方法,强制图例形状为所需的框。

    renderer = new XYLineAndShapeRenderer()
    {
        private static final long serialVersionUID = 1L;

        public LegendItem getLegendItem(int datasetIndex, int series)
        {
            LegendItem legend = super.getLegendItem(datasetIndex, series);
            return new LegendItem(legend.getLabel(), legend.getDescription(), legend.getToolTipText(), legend.getURLText(), Plot.DEFAULT_LEGEND_ITEM_BOX, legend.getFillPaint());
        }
    };
2个回答

8

如果您想用自己的LegendItem替换渲染器创建的那个,请覆盖getLegendItem()方法。

补充说明:这里有一个简单的示例,可以帮助您入门。

XYPlot plot = (XYPlot) chart.getPlot();
plot.setRenderer(new MyRenderer());
...
private static class MyRenderer extends XYLineAndShapeRenderer {

    @Override
    public LegendItem getLegendItem(int dataset, int series) {
        LegendItem legendItem = super.getLegendItem(dataset, series);
        System.out.println(dataset + " " + series + " " + legendItem.getShape());
        // modify legendItem here
        return legendItem;
    }
}

我可能有点慢,你能给我一个提示怎么做吗?我很乐意简单地用Plot.DEFAULT_LEGEND_ITEM_BOX替换图例图形,但我不确定如何保持其余的图例信息与原始信息一致。我是否只需获取所有属性并在新图例中设置它们? - Richard B
@RichardB:我已经概述了上面的方法。 - trashgod
谢谢。我稍微修改了你的方法(请参见上文)。 - Richard B

2
获取渲染器并执行以下操作:
XYItemRenderer renderer = plot.getRenderer();
BasicStroke thickLine = new BasicStroke( 4.0f ); 
renderer.setSeriesStroke(0, thickLine); 

这将使您的线条更加粗细。


如果问题是线条太细,您可以调整渲染线条的粗细。所以没问题。 - fonZ
啊,这很有道理。只需要重写 getLegendItem() 方法,就可以得到一个与渲染器不同的 LegendItem - trashgod
我原以为图表上呈现的线条与图例中的线条是一样的。因此,我假设改变图表线条也会改变图例中的线条。 - fonZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接