die Möglichkeit zur Begrenzung sieht man auch im mehr oder weniger Referenzbeispiel
http://www.java2s.com/Code/Java/Chart/JFreeChartBarChart3DDemo3withitemlabelsdisplayed.htm
allerdings gibt es keine absolute, nur in % der Breite,
das wächst eben mit bei größerer Chart, aber nur auf natürliche gleichförmige Weise,
nützt wirklich größere Chart mit gleichbleibenden, vergleichsweise dünneren Balken?
wie auch immer aktuell, allgemein ja interssante Frage, die Möglichkeit gibt es aktuell nicht denke ich,
Layoutmanger wird nicht helfen, Chart muss ja breiter werden,
falls extrem dringend, dann vielleicht zwei unschöne Wege ins Auge fassen:
a) Listener auf Größenänderung des Chart-Panels, %-Wert für Bar-Width manuell neuberechnen und setzen,
bei besonderen Pech unschöne Sprungeffekte, erst größer zu sehen, dann angepasst
b) irgendwo überschreibender Eingriff in Quellcode von JFreeChart, ich habe da selber das ein oder andere…
geradezu human wäre, falls der BarPainter beim BarRenderer getMaximumBarWidth() abfragt, dann könnte man diese Methode überschreiben
und dort einen angepassten Wert zurückgeben,
allerdings vielleicht für mehrere BarRenderer-Klassen einzeln
oder irgendwo beim Painten oder size-Methode von Plot, wobei dann nach z.B. StackTrace nach Quelle zu unterscheiden ist?..
habe getMaximumBarWidth() testweise umgesetzt, scheint ganz gut zu funktionieren
public class BarChart3DDemo3
extends ApplicationFrame
{
/** */
private static final long serialVersionUID = 1L;
ChartPanel chartPanel;
public BarChart3DDemo3(final String title)
{
super(title);
final CategoryDataset dataset = createDataset();
final JFreeChart chart = createChart(dataset);
chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);
}
private CategoryDataset createDataset()
{
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(25.0, "Series 1", "Category 1");
dataset.addValue(34.0, "Series 1", "Category 2");
dataset.addValue(19.0, "Series 2", "Category 1");
dataset.addValue(29.0, "Series 2", "Category 2");
dataset.addValue(41.0, "Series 3", "Category 1");
dataset.addValue(33.0, "Series 3", "Category 2");
return dataset;
}
private JFreeChart createChart(final CategoryDataset dataset)
{
final JFreeChart chart = ChartFactory.createBarChart3D("3D Bar Chart Demo", // chart
// title
"Category", // domain axis
// label
"Value", // range axis
// label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips
false // urls
);
final CategoryPlot plot = chart.getCategoryPlot();
final CategoryAxis axis = plot.getDomainAxis();
axis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 8.0));
final CategoryItemRenderer renderer = plot.getRenderer();
renderer.setItemLabelsVisible(true);
final BarRenderer r = (BarRenderer)renderer;
Helper.debug(r.getClass());
BarRenderer3D b = new BarRenderer3D()
{
/**
* @inheritDoc
*/
@Override
public double getMaximumBarWidth()
{
double d = 0.05 * (500.0 / chartPanel.getWidth());
return d;
}
};
plot.setRenderer(b);
return chart;
}
public static void main(final String[] args)
{
final BarChart3DDemo3 demo = new BarChart3DDemo3("3D Bar Chart Demo 3");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}
die 500 ist dabei die Breite (Standard bei Anzeige) bei der 0.05 = 5% ‚gut‘ ist, andere Kombinationen gehen auch,
vielleicht auch 25/ chartPanel.getWidth() eingängiger,