Hi Ernesto,
Thanks a lot for your response, it pushed me into the right direction. I ended up overriding the portrayal draw method as follows:
public void draw(Object object, Graphics2D graphics, DrawInfo2D info) {
if(isImmutableField()) {
if(isDirtyField()) {
buffer = new BufferedImage((int) info.draw.width, (int) info.draw.height, BufferedImage.TYPE_INT_ARGB);
drawGraph(buffer.createGraphics(), info);
setDirtyField(false);
}
graphics.drawImage(buffer,0,0,(int) info.draw.width,(int) info.draw.height,null);
} else {
drawGraph(graphics, info);
}
Just swapping out the graphics object (in my drawGraph method) is all that seems to be needed to make an image instead of drawing into the display directly.
The display is working fine, except when resizing the window or using the scale buttons. As you mentioned I need to catch resize / scale events and set the dirtyField variable to make it work - do you know how to do that? I can't find a way to register for these events.
Cheers,
Miriam
________________________________
Von: MASON Multiagent Simulation Toolkit [[log in to unmask]]" im Auftrag von "Ernesto Carrella [[log in to unmask]]
Gesendet: Dienstag, 8. September 2015 11:13
An: [log in to unmask]
Betreff: Re: Caching Portrayals as Images
Hello,
I have never done this so hopefully somebody will give you a better suggestion but Display2d (and cognates) is a JComponent so you should be able to attach the portrayal to the display2d, feed a BufferedImage's graphics object to the display2d paint(g) method and get a fixed image out of it. Something like this:
http://stackoverflow.com/questions/1349220/convert-jpanel-to-image
You'd probably have to listen to resize events to redraw the image and so on, but it may be what you are looking for.
Portrayals have their own draw(g,x,y) method so there might be a faster, direct way of painting images from them but I am not really sure what the DrawInfo2D argument would look like.
Good luck.
On Tue, Sep 8, 2015 at 9:26 AM Tschanen Miriam <[log in to unmask]<mailto:[log in to unmask]>> wrote:
Hi all,
A while ago I mentioned that I was trying to display static JUNG graphs with a MASON portrayal class. The display is working very well at the moment (in no small part due to the help I received), but constantly redrawing the graph is putting a heavy load on my system. If I remember correctly, Sean suggested caching the graph as an image and redrawing that instead, since the underlying data never changes. This should give me a nice boost in performance.
I was hoping someone could give me a few pointers on how to actually do that. There's a tutorial about displaying an image in a portrayal in the MASON How-Tos (https://cs.gmu.edu/~eclab/projects/mason/docs/howto.html#display2d), but I can't figure out how to store my graph as an image in the first place. There must be a way to rewire the output of my portrayal class to draw directly into the image. Any help would be much appreciated.
Cheers,
Miriam Tschanen
|