You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

This page shows how to generate JFreeChart based charts from Wicket that displays tooltips.
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

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

TimeSeriesChartExamplePage.java

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.

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

  • No labels