1 Attachment(s)
Java tip Sep 22, 2010 - "Screenshots" of swing components
Introduction
Ever want to take a screenshot of only your program's GUI? In this tip, I will discuss a simple mechanism to allow you to do just that. In fact, you can even take screenshots of only portions of your program's GUI.
Difficulty: Easy-medium. Knowledge of Java syntax is assumed, but the code is fairly easy to read and follow.
Awt and Swing Paint method
This tip is a very simple way to take a "screenshot" of a Java Awt/Swing component. It plays on the fact that the paint method can take any Graphics object regardless of what it's actually painting to. Also, because the paint method recursively paints sub-components, you will get all of those components as well. If you only want your component, then call the paintComponent method with the image's Graphics object.
There is one thing to keep in mind before using this (there might be others, but this is the only one I could think of off the top of my head):
1. Your paint method should not modify the state of your program. This should already be the case, and if it's not, you may want to reconsider how your program is designed.
Code
Here's the code, it's fairly simple. Just create an image that's the same size as the component you want to take a screenshot of, and call the paint method on the image's graphics object.
Conclusion
Where would you want to use this?
One application I had was in a Plotting application (maybe this will be my next tip, it's still not quite done yet). It looks great on-screen, but It would be much better if I could save the contents into an Image. Yes you could use the PrntSc button and take a screen-shot from your OS, but I find this method has several advantage:
1. No Photoshopping is required to get your image down to the correct size
2. You can layer other windows/components on top of the component you want to take a screen-shot of and you will still get only your component.
3. You can "zoom" in or out by passing in a graphics object that is larger or smaller than the actual component you are interested in. Do note that if you try this, your painting methods should not use the component's getWidth() or getHeight() methods. Instead, get the graphics object's clipping bounds if you want your component to be .be able to be resized. I believe most of the default AWT/Swing components already use the graphics's clip bounds instead of the component's width/height so you should be ok here.
Here's a sample screen-shot I made:
Attachment 212
That's all there is for this tip. Happy coding :)
Re: Java tip Sep 22, 2010 - "Screenshots" of swing components
Very interesting read once again!! Loving this feature :)
Re: Java tip Sep 22, 2010 - "Screenshots" of swing components
Hey, I did something just like this for adding a report/screenshot function in my game.
Re: Java tip Sep 22, 2010 - "Screenshots" of swing components
I used something very similar to this (but with TYPE_INT_ARGB) and then used the javax.imageio package to save it as a PNG. Works like a charm.
Code :
public void saveToFile(String filename) {
try {
// Save as PNG
String fn = filename + ".png";
File file = new File(fn);
ImageIO.write(image, "png", file);
} catch (IOException e) {}
}