了解しました。クライアントが希望するとおりに機能させました。
まず、新しい種類の名前を付ける必要があります。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()
各アイテムの幅と高さを計算します。凡例が複数行になっているため、1つのアイテムの各行の幅が他のアイテムと同じになることはありません。アイテムの実際の幅を定義するには、最も長いものを見つける必要があります。身長についても同じです。これで複数行になるため、アイテムの実際の高さを知るために取得した行数を計算する必要があります。
オプションで、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);
それでおしまい。
結果 :