Creating screenshots with Java is really straightforward. The more complicated part is to implement a convenient way to select a rectangular area on the screen. The snippet below shows how to implement a rectangular clipping selector using SWT and the Tracker widget.
import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; public class ClippingSelector { public Rectangle select() { final Display display = Display.getDefault(); //convert desktop to image final Image backgroundImage = new Image(display, display.getBounds().width, display.getBounds().height); GC gc = new GC(display); gc.copyArea(backgroundImage, display.getBounds().x, display.getBounds().y); gc.dispose(); //invisible shell and parent for tracker final Shell shell = new Shell(display.getActiveShell(), SWT.NO_BACKGROUND | SWT.ON_TOP); shell.setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_CROSS)); shell.setBounds(display.getBounds()); final Rectangle result = new Rectangle(0, 0, 0, 0); shell.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { Tracker tracker = new Tracker(shell, SWT.RESIZE); tracker.setStippled(true); tracker.setRectangles(new Rectangle[] { new Rectangle(e.x, e.y, 0, 0) }); tracker.open(); Rectangle selection = tracker.getRectangles()[0]; result.width = selection.width; result.height = selection.height; result.x = shell.toDisplay(selection.x, selection.y).x; result.y = shell.toDisplay(selection.x, selection.y).y; shell.dispose(); } }); shell.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { shell.dispose(); //any key pressed close shell } }); shell.addShellListener(new ShellAdapter() { @Override public void shellDeactivated(ShellEvent e) { shell.dispose(); //close shell if another shell is activated } }); shell.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { e.gc.drawImage(backgroundImage, -1, -1); //paint background image on invisible shell } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } backgroundImage.dispose(); shell.dispose(); return result; } public static void main(String[] args) { final Display display = new Display(); final Shell shell = new Shell(display); final Rectangle rect = new ClippingSelector().select(); if (rect.height == 0 || rect.width == 0) return; //we show the selected area in a new shell. Just for demonstration! final Image image = new Image(display, rect); final GC gc = new GC(display); gc.copyArea(image, rect.x, rect.y); gc.dispose(); shell.setBounds(rect); shell.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { e.gc.drawImage(image, 0, 0); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }