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]
>
>