// ZoomWindow.java import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * a JFrame that presents a given image at some initial magnification * which can be stretched and shrunk by the user without changing * its aspect ratio. * * @author Melinda Green */ public class ZoomWindow extends JFrame { private float zoomMagnification; /** * creates a ZoomWindow which displays given images which are always * scaled to the window size and tracks changes to window size. */ public ZoomWindow(String title, float zoomMagnification) { super(title); this.zoomMagnification = zoomMagnification; } public void setImage(final Image zoomimage) { int imageWidth = zoomimage.getWidth(null); int imageHeight = zoomimage.getHeight(null); final float imageAspectRatio = imageWidth / (float)imageHeight; final Dimension minimumImageSize = new Dimension(imageWidth, imageHeight); //System.out.println("min image size = " + minimumImageSize); Component minbox = javax.swing.Box.createRigidArea(minimumImageSize); getContentPane().add(minbox); // just for measurement. removed below pack(); // just to measure the min window size. true size is set at end. Dimension minimumWindowSize = new Dimension(getSize()); int winXdiff = minimumWindowSize.width - minimumImageSize.width; int winYdiff = minimumWindowSize.height - minimumImageSize.height; //System.out.println("min window size: " + minimumWindowSize + " diffs: " + winXdiff + "," + winYdiff); int scaledImageWidth = Math.round(imageWidth * zoomMagnification); int scaledImageHeight = Math.round(imageHeight * zoomMagnification); final Dimension preferedImageSize = new Dimension(scaledImageWidth, scaledImageHeight); final JPanel canvas = new JPanel() { public void paint(Graphics g) { super.paint(g); // get the requested new size Dimension canvasSize = getSize(); Dimension largestImage = new Dimension(canvasSize); if (largestImage.width / (float)largestImage.height > imageAspectRatio) largestImage.width = (int)Math.ceil(largestImage.height * imageAspectRatio); else largestImage.height = (int)Math.ceil(largestImage.width / imageAspectRatio); int xpadding = canvasSize.width - largestImage.width; int ypadding = canvasSize.height - largestImage.height; g.drawImage(zoomimage, xpadding/2 , ypadding/2, largestImage.width, largestImage.height, null); } public Dimension getMinimumSize() { return minimumImageSize; } public Dimension getPreferedSize() { return preferedImageSize; } }; //System.out.println("requested image size " + preferedImageSize); getContentPane().removeAll(); getContentPane().add(canvas); Dimension initialWinSize = new Dimension( preferedImageSize.width +winXdiff, preferedImageSize.height+winYdiff); setSize(initialWinSize); //System.out.println("new window size " + this.getSize()); } /** * a simple example program puts up a ZoomWindow displaying a named image * expected to be found in the classpath. */ public static void main(String args[]) { String image_file_name = args.length == 1 ? args[0] : "zoomtest.jpg"; Image testImage = new ImageIcon(ClassLoader.getSystemResource(image_file_name)).getImage(); ZoomWindow zoomwin = new ZoomWindow("ZoomWindow Example", 3); zoomwin.setImage(testImage); zoomwin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); zoomwin.setVisible(true); } } // end class ZoomWindow