Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This page shows how to generate JFreeChart based charts from Wicket that displays tooltips.
It builds on the example JFreeChart and wicket example Tooltips are very important especially in charts like line charts, time-series charts etc.
Let us see a simple time series chart example.

TimeSeriesChartExamplePage.html

Code Block

<html>
<body>
 <img wicket:id="chart" usemap="#tooltip"></img>
</body>
</html>

TimeSeriesChartExamplePage.java

Code Block

public final class TimeSeriesChartExamplePage extends WebPage
{
    public TimeSeriesChartExamplePage()
    {
        super();
        add(createChartImage());
    }

    private Image createChartImage()
    {
        return new JFreeChartImageWithToolTip("chart", getChartModel(), "tooltip", 800, 400);
    }

    private IModel<JFreeChart> getChartModel()
    {
        return new LoadableDetachableModel<JFreeChart>()
        {
            @Override
            protected JFreeChart load()
            {
                return createTimeSeriesChart();
            }
        };
    }

    private JFreeChart createTimeSeriesChart()
    {
        //create a chart based on a time series dataset
        TimeSeries timeSeries = new TimeSeries("Page hits", Month.class);
        for (int i = 1; i <= 10; i++) {
            timeSeries.add(new Month(i, 2010), (i * 1000));
        }
        TimeSeriesCollection dataSet = new TimeSeriesCollection(timeSeries);
        JFreeChart chart = ChartFactory.createTimeSeriesChart("Page hits in a month", "Months",
                "Page hits", dataSet, false, true, false);

        //set some chart attributes
        return applyChartAttributes(chart);
    }

    private JFreeChart applyChartAttributes(JFreeChart chart)
    {
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setDomainCrosshairVisible(true);
        plot.setRangeCrosshairVisible(true);

        XYItemRenderer r = plot.getRenderer();
        if (r instanceof XYLineAndShapeRenderer) {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
            renderer.setBaseShapesVisible(true);
            renderer.setBaseShapesFilled(true);
            renderer.setSeriesPaint(0, Color.BLUE);
        }
        return chart;
    }

JFreeChartImageWithToolTip.java
NOTE: This class was taken from the http://markmail.org/message/r36cvdt2o3c4pki6#query:wicket%20jfreechart%20tooltips+page:1+mid:xqpnjdsj2lnkoinq+state:results with minor changes to make use of wicket models.

Code Block

public class JFreeChartImageWithToolTip extends NonCachingImage
{
    private static final Logger logger = LoggerFactory.getLogger(JFreeChartImageWithToolTip.class);
    private String imageMapId;
    private int width;
    private int height;
    private ChartRenderingInfo chartRenderingInfo = new ChartRenderingInfo(new StandardEntityCollection());

    public JFreeChartImageWithToolTip(String id, IModel<JFreeChart> model, String imageMapId, int width, int height)
    { 
        super(id, model);
        this.imageMapId = imageMapId;
        this.width = width;
        this.height = height;
    }

    @Override
    protected Resource getImageResource()
    {        
        Resource imageResource = null;
        final JFreeChart chart = (JFreeChart) getDefaultModelObject();
        imageResource = new DynamicImageResource()
        {
            @Override
            protected byte[] getImageData()
            {
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                try {
                    if (chart != null) {
                        chartRenderingInfo.clear();     
                        ChartUtilities.writeChartAsPNG(stream, chart, width, height, chartRenderingInfo);
                    }
                } catch (IOException ex) {
                    logger.error("Error occured while creating chart", ex);
                }
                return stream.toByteArray();
            }
        };
        return imageResource;
    }

    @Override
    protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag)
    {
        JFreeChart chart = (JFreeChart) getDefaultModelObject();
        if (chart == null) {
            return;
        }
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        try {
            if (chart != null) {
                chartRenderingInfo.clear();                
                ChartUtilities.writeChartAsPNG(stream, chart, width, height, chartRenderingInfo);
            }
        } catch (IOException ex) {
            logger.error("Error occured while creating chart", ex);
        }        
        replaceComponentTagBody(markupStream, openTag, ChartUtilities.getImageMap(imageMapId, chartRenderingInfo));
    }

Result

Image Added