If the user clicks the Reduce button, the image is reduced by a factor of two in each dimension, as you can see in Figure 3.8. Figure 3.8. Reducing an image.This one works by using the BufferedImage class's getScaledInstance method, which it inherits from the Image class. This method changes the size of an image, but it returns an Image object, so it takes a little work to get back to a BufferedImage object: if(event.getSource() == button5){ bufferedImageBackup = bufferedImage; image = bufferedImage.getScaledInstance (bufferedImage.getWidth()/2, bufferedImage.getHeight()/2, 0); bufferedImage = new BufferedImage ( bufferedImage.getWidth()/2, bufferedImage.getHeight()/2, BufferedImage.TYPE_INT_BGR ); bufferedImage.createGraphics().drawImage(image, 0, 0, this ); . . . } After you convert from an Image object back to a BufferedImage object, you need to resize the window, subject to a certain minimum size, to correspond to the new image: if(event.getSource() == button5){ . . . bufferedImage = new BufferedImage ( bufferedImage.getWidth()/2, bufferedImage.getHeight()/2, BufferedImage.TYPE_INT_BGR ); bufferedImage.createGraphics().drawImage(image, 0, 0, this ); setSize(getInsets().left + getInsets().right + Math.max(400, bufferedImage.getWidth() + 60), getInsets().top + getInsets().bottom + Math.max(340, bufferedImage.getHeight() + 60)); button1.setBounds(30, getHeight() - 30, 60, 20); button2.setBounds(100, getHeight() - 30, 60, 20); button3.setBounds(170, getHeight() - 30, 60, 20); button4.setBounds(240, getHeight() - 30, 60, 20); button5.setBounds(310, getHeight() - 30, 60, 20); repaint(); } That completes the Resize button's operationand that completes all the buttons. The Graphicizer tools are in place. The last operation to take a look at isn't really an operation at allit's the Undo action that the user can select with the File menu's Undo menu item. |