Listing 3. Source code for Prob09.
/*File Prob09 Copyright 2008 R.G.Baldwin
Revised 09/13/10

*********************************************************/
import java.awt.geom.AffineTransform;
import java.awt.Graphics2D;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JLabel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class Prob09{
  //DO NOT MODIFY THE CODE IN THIS CLASS DEFINITION.
  public static void main(String[] args){
    new Prob09Runner();
  }//end main method
}//end class Prob09
//End program specifications.
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

/*------------------------------------------------------//

*********************************************************/
class Prob09Runner extends JFrame{

  private JPanel mainPanel = new JPanel();
  private JPanel titlePanel = new JPanel();
  private JSlider slider = new JSlider(0,100,0);

  private Picture beach = new Picture("Prob09a.jpg");
  private Picture butterfly = new Picture("Prob09b.jpg");

  private int beachWidth = beach.getWidth();
  private int beachHeight = beach.getHeight();

  private Picture display =
            new Picture(beachWidth,beachHeight);

  private Image image = null;
  private Graphics graphics = null;
  private AffineTransform transform = null;
  private Graphics2D g2 = null;

  public Prob09Runner(){//constructor

    System.out.println("Dick Baldwin");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    beach.addMessage("Dick Baldwin",10,20);
    butterfly.addMessage("Dick Baldwin",10,20);

    slider.setMajorTickSpacing(10);
    slider.setMinorTickSpacing(5);
    slider.setPaintTicks(true);
    slider.setPaintLabels(true);

    mainPanel.setLayout(new BorderLayout());
    titlePanel.add(new JLabel(
                          "Percent Size of Beach Image"));
    mainPanel.add(titlePanel,BorderLayout.NORTH);
    mainPanel.add(slider,BorderLayout.CENTER);

    getContentPane().add(mainPanel);
    //pack();
    setSize(beachWidth + 7,97);
    setTitle("Dick Baldwin");
    setLocation(0,beachHeight + 25);
    setVisible(true);

    //Draw and display the background image of the
    // butterfly.
    graphics = display.getGraphics();
    graphics.drawImage(butterfly.getImage(),0,0,null);

    display.show();
    //--------------------------------------------------//
    //Register an anonymous listener object on the slider.
    //Each time the slider fires a ChangeEvent, this event
    // handler restores the background image of the
    // butterfly. Then it draws a scaled version of the
    // beach on top of the background image using the
    // slider value, which ranges from 0 to 100 as the
    // scale factor as a percent of 1.0. The image of the
    // beach is always aligned with the center
    // of the contentPane of the JFrame.
    slider.addChangeListener(
      new ChangeListener(){
        public void stateChanged(ChangeEvent e){

          //Restore the background image of the butterfly.
          graphics = display.getGraphics();
          graphics.drawImage(
                          butterfly.getImage(),0,0,null);

          drawScaledPictureOnPicture(beach,
                                     display,
                                     slider.getValue());
          display.repaint();
        }//end stateChanged
      }//end new ChangeListener
    );//end addChangeListener
    //--------------------------------------------------//
  }//end constructor
  //----------------------------------------------------//

  //Scales and draws the source picture onto the center
  // of the destination picture.
  private void drawScaledPictureOnPicture(
                                      Picture source,
                                      Picture dest,
                                      double scaleFactor){

    transform = new AffineTransform();

    double translateX = dest.getWidth()/2
                    - source.getWidth()*scaleFactor/100/2;
    double translateY = dest.getHeight()/2
                  - source.getHeight()*scaleFactor/100/2;;
    transform.translate(translateX,translateY);
    transform.scale(scaleFactor/100.0,scaleFactor/100.0);
    
    //Get the Graphics2D object used to draw on the
    // destination picture.
    g2 = (Graphics2D)dest.getGraphics();

    //Scale and draw the source image on the destination
    // image.
    g2.drawImage(source.getImage(),transform,null);

  }//end drawScaledPictureOnPicture method
}//end class Prob09Runner