I would be nice for this work as we have a JFreeChart written which is called by other apps too.
> Date: Sat, 14 Nov 2009 10:23:38 +0100 > From: [email protected] > To: user [email protected] > Subject: Re: Updating a Dynamic Image with AJAX (and JFreeChart) > > Hi there, > is JFreeChart your only possible approach? Check out flot integration > from wicketstuff-core. > It draws nicer charts and you can update datasets sending json object > and redraw it by js. > > Regards, > Wojtek > > > Swarnim Ranjitkar pisze: > > I couldn't override getResourceState of DynamicImageResource as it new > > Resource state uses variable from DynamicImageResource eg format. Instead i > > copied DynamicImageResource class and made my own version of it and > > modified the getResourceState() get method. When I changed the drop down I > > was expecting it to call the geImageData but it wasn't calling it. Could > > you please advice. > > Here is the modified method. > > protected synchronized ResourceState getResourceState() > > { > > return new ResourceState() > > { > > private byte[] imageData; > > private final String contentType = "image/" + format; > > > > @Override > > public Time lastModifiedTime() > > { > > if (lastModifiedTime == null) > > { > > lastModifiedTime = > > DynamicImageResource.this.lastModifiedTime; > > if (lastModifiedTime == null) > > { > > lastModifiedTime = Time.now(); > > } > > } > > return lastModifiedTime; > > } > > > > @Override > > public byte[] getData() > > { > > // here is what I made the change. > > imageData = getImageData(); > > return imageData; > > } > > > > @Override > > public String getContentType() > > { > > return contentType; > > } > > }; > > } > > > > From my Image Class I called the copied version of in getImageResource() > > { > > > > return new DynamicImageResource(){ > > > > > > public class TugboatChartImage extends NonCachingImage { > > > > private int width; > > private int height; > > > > public TugboatChartImage(String id, JFreeChart chart, int width, int > > height){ > > super(id, new Model(chart)); > > this.width = width; > > this.height = height; > > } > > > > @Override > > protected Resource getImageResource() { > > return new DynamicImageResource(){//my copied version of > > DynamicResouce > > @Override > > protected byte[] getImageData() { > > JFreeChart chart = (JFreeChart)getDefaultModelObject(); > > return toImageData(chart.createBufferedImage(width, > > height)); > > } > > > > > > }; > > } > > > > } > > > > > > > >> To: [email protected] > >> From: [email protected] > >> Subject: Re: Updating a Dynamic Image with AJAX (and JFreeChart) > >> Date: Fri, 13 Nov 2009 23:31:39 -0500 > >> > >> Look at the source of the DynamicImageResource class. The > >> getResourceState method does something like (sorry for the lame > >> pseudocode) 'if image data is null then save and return value of > >> getImageData else return the previous image data'. So its gonna call your > >> getImageData() method once and save the value. This falls in line with > >> the super class's (DynamicWebResource) javadoc that says: > >> > >> very useful for things you generate dynamically, but reuse for a while > >> after that. If you need resources that stream directly and are not > >> cached, extend WebResource directly and implement > >> Resouce.getResourceStream() yourself. > >> > >> It has nothing to do with HTTP caching, which it looks like you're trying > >> to solve with your headers, but server-side caching. Anyways... in this > >> case, getResourceStream of WebResource ends up calling getResourceState of > >> DynamicImageResource. All you need to do is is override getResourceState > >> (and therefore kind of overrides the behavior of getResourceStream) of > >> your DynamicImageResource and ensure that it doesn't cache the result of > >> getImageData() and you should be set. > >> > >> Craig > >> _____ > >> > >> From: wicketnewuser [mailto:[email protected]] > >> To: [email protected] > >> Sent: Fri, 13 Nov 2009 20:32:05 -0500 > >> Subject: Re: Updating a Dynamic Image with AJAX (and JFreeChart) > >> > >> > >> I have same situation. I'm not able to refresh my image. But if i view > >> the > >> image i do get refreshed image > >> Here is my code. Based on my dropdownchoice it should make new Jfreechart > >> and the image should refresh. I couldn't get it working so i wrapped the > >> image with in a span but it still doesn't work. TugboatChartImage extends > >> NonCachingImage . Can any one point out what I'm doing wrong > >> Chart chart1 = new Chart(this.getString(column1.toString()), "Date", > >> "Dollars"); > >> final String yAxisType = "linear"; > >> final int smallChartWidth=400; > >> final int smallChartHeight=200; > >> JFreeChart jfChartOne = chart1.render(chartOneCollection, null, > >> yAxisType, > >> smallChartWidth, smallChartHeight); > >> > >> > >> // make an image > >> final TugboatChartImage imageOne = new TugboatChartImage("chart1image", > >> jfChartOne, smallChartWidth, smallChartHeight); > >> final WebMarkupContainer chart1Span = new > >> WebMarkupContainer("chart1Span"); > >> chart1Span.add(imageOne); > >> add(chart1Span); > >> > >> // draw chart 2 > >> Chart chart2 = new Chart(this.getString(column2.toString()), "Date", > >> "Count"); > >> JFreeChart jfChartTwo = chart2.render(chartTwoCollection, null, > >> yAxisType, > >> smallChartWidth, smallChartHeight); > >> > >> // make an image > >> TugboatChartImage imageTwo = new TugboatChartImage("chart2image", > >> jfChartTwo, smallChartWidth, smallChartHeight); > >> add(imageTwo); > >> String filterStringList =""; > >> if (filterStringList!= null){ > >> filterStringList = > >> report.getFilterParameterList().toString().replaceAll("\\[", ""); > >> filterStringList = filterStringList.replaceAll("\\]", ""); > >> } > >> final DropDownChoice<TugboatReportData.ColumnName> chart1Select = new > >> DropDownChoice<TugboatReportData.ColumnName>("chart1Select" ,new > >> PropertyModel(this, "column1"), TugboatReportData.trafficColumns,new > >> IChoiceRenderer() { > >> public Object getDisplayValue(Object obj) { > >> //this.getString give you value from the propertyfile > >> return > >> ReportResultsPage.this.getString(((TugboatReportData.ColumnName) > >> obj).toString()); > >> } > >> > >> public String getIdValue(Object obj, int index) { > >> return obj.toString(); > >> } > >> }); > >> chart1Select.add(new AjaxFormComponentUpdatingBehavior("onchange") { > >> protected void onUpdate(AjaxRequestTarget target) { > >> sortByColumn(displayRowSetFinal, column1); > >> Chart chart1R = new > >> Chart(ReportResultsPage.this.getString(column1.toString()), "Date", > >> "Dollars"); > >> > >> SwishTimeSeriesCollection chartOneCollectionR = > >> createChartCollection(report, originalRowSet, > >> displayRowSetFinal.subList(0, > >> (originalRowSet.size() > 10) ? 9 : originalRowSet.size() - 1), column1); > >> logger.error(displayRowSetFinal); > >> JFreeChart jfChartOneR = chart1R.render(chartOneCollectionR, > >> null, > >> yAxisType, smallChartWidth, smallChartHeight); > >> imageOne.setDefaultModelObject(jfChartOneR); > >> imageOne.modelChanged(); > >> chart1Span.modelChanged(); > >> chart1Span.setOutputMarkupId(true); > >> imageOne.setOutputMarkupId(true); > >> target.addComponent(imageOne); > >> target.addComponent(chart1Span); > >> } > >> }); > >> > >> Jason Mihalick wrote: > >> > > >> > I am integrating JFreeChart into my application and I've followed the > >> > JFreeChart example on the wiki. That works very nicely. I was > >> impressed. > >> > What I want to do now is update the graph that I display based on the > >> > selection from a drop down list. I've successfully added the > >> > DropDownChoice component and added a AjaxFormComponentUpdatingBehavior > >> to > >> > it. I've verified that my onUpdate( AjaxRequestTarget ) method is > >> being > >> > invoked and I'm receiving the updated value, which is very cool. Here > >> is > >> > my onUpdate implementation for the DropDownChoice control: > >> > > >> > protected void onUpdate( AjaxRequestTarget target ) { > >> > log.debug( "graphStyles onUpdate invoked! SelectedGraphStyle = " + > >> > FieldResultsPanel.this.getSelectedGraphStyle() ); > >> > FieldResultsPanel.this.updateGraph(); // Update the model and > >> re-create > >> > the JFreeChart Image > >> > > >> > // fieldGraph is my JFreeChartImage instance (derived from Image) > >> > // This is supposed to indicate back to the browser that the image > >> needs > >> > updated. I think this > >> > // is working properly > >> > target.addComponent( FieldResultsPanel.this.fieldGraph ); > >> > } > >> > > >> > Even though I am updating the model of my JFreeChartImage, it appears > >> that > >> > the getImageData method is never invoked afterwards. > >> > > >> > What do I need to do in order to get the image data to be re-read? > >> > > >> > Here is my JFreeChartImage class: > >> > > >> > public class JFreeChartImage extends Image { > >> > > >> > private static final Logger log = LoggerFactory.getLogger( > >> > JFreeChartImage.class ); > >> > > >> > private int width; > >> > private int height; > >> > > >> > public JFreeChartImage( String id ) { > >> > super( id ); > >> > } > >> > > >> > public JFreeChartImage( String id, int width, int height ) { > >> > this( id ); > >> > this.width = width; > >> > this.height = height; > >> > } > >> > > >> > public JFreeChartImage( String id, JFreeChart chart, int width, int > >> > height ) { > >> > super(id, new Model( chart ) ); > >> > this.width = width; > >> > this.height = height; > >> > } > >> > > >> > public Component setModel( JFreeChart chart ) { > >> > log.debug( "setModel invoked with chart: " + chart ); > >> > return super.setModel( new Model( chart ) ); > >> > } > >> > > >> > @Override > >> > protected Resource getImageResource() { > >> > > >> > return new DynamicImageResource(){ > >> > private static final long serialVersionUID = 1L; > >> > > >> > @Override > >> > protected byte[] getImageData() { > >> > log.debug( "Invoking getImageData..." ); > >> > JFreeChart chart = (JFreeChart)getModelObject(); > >> > log.debug( "Chart object: " + chart ); > >> > return toImageData( chart.createBufferedImage( width, height ) > >> ); > >> > } > >> > > >> > @Override > >> > protected void setHeaders( WebResponse response ) { > >> > if ( isCacheable() ) { > >> > super.setHeaders(response); > >> > } else { > >> > response.setHeader( "Pragma", "no-cache" ); > >> > response.setHeader( "Cache-Control", "no-cache" ); > >> > response.setDateHeader( "Expires", 0 ); > >> > } > >> > } > >> > }; > >> > } > >> > > >> > Any help is much appreciated! > >> > > >> > -- > >> > Jason > >> > > >> > >> -- > >> View this message in context: > >> http://old.nabble.com/Updating-a-Dynamic-Image-with-AJAX-%28and-JFreeChart%29-tp12884455p26346217.html > >> Sent from the Wicket - User mailing list archive at Nabble.com. > >> > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: [email protected] > >> For additional commands, e-mail: [email protected] > >> > >> > >> > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] >
