JFreeChart, setze die Width für eine Bar in BarChart3D

Ich erzeuge ein BarChart3D mittels JFreeChart. Das ChartPanel nutzt bei mir z.Zt. den LayoutManger BorderLayout.CENTER, d.h. wenn das JFrame vergrößert wird, passt sich das ChartPanel entsprechend an, das ist ok. Dabei werden die Bars aber auch gerendert und passen sich auch in der Width (und Height )an. Ich möchte aber, dass die Bars immer die gleiche Width beibehalten. Muss ich da wohl einen anderen Layoutmanger nutzen für das ChartPanel oder kann ich direkt auf die Bars zugreifen,

z.B.
jFreeChart.getCategoryPlot().getRenderer().getSeries.

Weiß mir jemand zu helfen?

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… :wink:

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,

cool :slight_smile: