7

私の JFreeChart 時系列プロットでは、凡例の線が細すぎて色を正確に表示できません。別の投稿 [ https://stackoverflow.com/questions/7306901/jfreechart-change-sample-of-colors-in-legend ] は、次のようにレンダラー メソッドをオーバーライドすることを提案しました。

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());
        }
    };
4

2 に答える 2

8

レンダラーが作成するものの代わりに必要なgetLegendItem()ものを取得するには、オーバーライドする必要があります。LegendItem

補遺: これは、始めるのに役立つ簡単な例です。

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;
    }
}
于 2012-08-31T21:42:06.003 に答える
2

レンダラーを取得して、次の操作を行います。

XYItemRenderer renderer = plot.getRenderer();
BasicStroke thickLine = new BasicStroke( 4.0f ); 
renderer.setSeriesStroke(0, thickLine); 

これにより、線が太くなります。

于 2012-08-31T21:35:06.227 に答える