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.
// component is the component we want to take a screen shot of BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); Graphics gx = img.getGraphics(); component.paint(gx);
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:
test.jpg
That's all there is for this tip. Happy coding