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