Swing JFC Java

/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly 
*/
// CompassButtons.java
//A demonstration of the SpringLayout class. This application puts
//directional buttons on a panel and keeps them close to the edges of
//the panel regardless of the panel's size.
//
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JViewport;
import javax.swing.Spring;
import javax.swing.SpringLayout;
public class CompassButtons extends JFrame {
  JButton nb = new JButton("North");
  JButton sb = new JButton("South");
  JButton eb = new JButton("East");
  JButton wb = new JButton("West");
  JViewport viewport = new JViewport();
  public CompassButtons(String terrain) {
    super("SpringLayout Compass Demo");
    setSize(500, 300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    SpringLayout sl = new SpringLayout();
    Container c = getContentPane();
    c.setLayout(sl);
    int offset = 50; // gap between buttons and outside edge
    int w = 80; // width of buttons
    int h = 26; // height of buttons
    int border = 3; // border around viewport
    Spring offsetS = Spring.constant(offset);
    Spring borderS = Spring.constant(border);
    Spring widthS = Spring.constant(w);
    Spring halfWidthS = FractionSpring.half(widthS);
    Spring heightS = Spring.constant(h);
    Spring halfHeightS = FractionSpring.half(heightS);
    Spring leftEdgeS = sl.getConstraint(SpringLayout.WEST, c);
    Spring topEdgeS = sl.getConstraint(SpringLayout.NORTH, c);
    Spring rightEdgeS = sl.getConstraint(SpringLayout.EAST, c);
    Spring bottomEdgeS = sl.getConstraint(SpringLayout.SOUTH, c);
    Spring xCenterS = FractionSpring.half(rightEdgeS);
    Spring yCenterS = FractionSpring.half(bottomEdgeS);
    Spring leftBorder = Spring.sum(leftEdgeS, borderS);
    Spring topBorder = Spring.sum(topEdgeS, borderS);
    Spring northX = Spring.sum(xCenterS, Spring.minus(halfWidthS));
    Spring southY = Spring.sum(bottomEdgeS, Spring.minus(Spring.sum(
        heightS, offsetS)));
    Spring eastX = Spring.sum(rightEdgeS, Spring.minus(Spring.sum(widthS,
        offsetS)));
    Spring eastY = Spring.sum(yCenterS, Spring.minus(halfHeightS));
    c.add(nb,
        new SpringLayout.Constraints(northX, offsetS, widthS, heightS));
    c
        .add(sb, new SpringLayout.Constraints(northX, southY, widthS,
            heightS));
    c.add(wb);
    sl.getConstraints(wb).setX(offsetS);
    sl.getConstraints(wb).setY(eastY);
    sl.getConstraints(wb).setWidth(widthS);
    sl.getConstraints(wb).setHeight(heightS);
    c.add(eb);
    sl.getConstraints(eb).setX(eastX);
    sl.getConstraints(eb).setY(eastY);
    sl.getConstraints(eb).setWidth(widthS);
    sl.getConstraints(eb).setHeight(heightS);
    c.add(viewport); // this sets a bounds of (0,0,pref_width,pref_height)
    // The order here is important...need to have a valid width and height
    // in place before binding the (x,y) location
    sl.putConstraint(SpringLayout.SOUTH, viewport, Spring.minus(borderS),
        SpringLayout.SOUTH, c);
    sl.putConstraint(SpringLayout.EAST, viewport, Spring.minus(borderS),
        SpringLayout.EAST, c);
    sl.putConstraint(SpringLayout.NORTH, viewport, topBorder,
        SpringLayout.NORTH, c);
    sl.putConstraint(SpringLayout.WEST, viewport, leftBorder,
        SpringLayout.WEST, c);
    ImageIcon icon = new ImageIcon(getClass().getResource(terrain));
    viewport.setView(new JLabel(icon));
    // Hook up the buttons. See the CompassScroller class (on-line) for
    // details
    // on controlling the viewport.
    nb.setActionCommand(CompassScroller.NORTH);
    sb.setActionCommand(CompassScroller.SOUTH);
    wb.setActionCommand(CompassScroller.WEST);
    eb.setActionCommand(CompassScroller.EAST);
    CompassScroller scroller = new CompassScroller(viewport);
    nb.addActionListener(scroller);
    sb.addActionListener(scroller);
    eb.addActionListener(scroller);
    wb.addActionListener(scroller);
    setVisible(true);
  }
  public static void main(String args[]) {
    new CompassButtons(args.length == 1 ? args[0] : "terrain.gif");
  }
}
//FractionSpring.java
//A Spring extension that calculates its values based on an anchor Spring
//and a multiplier (> 0.0). Note that values greater than 1.0 can be
//used.
//
class FractionSpring extends Spring {
  protected Spring parent;
  protected double fraction;
  public FractionSpring(Spring p, double f) {
    if (p == null) {
      throw new NullPointerException("Parent spring cannot be null");
    }
    parent = p;
    fraction = f;
  }
  public int getValue() {
    return (int) Math.round(parent.getValue() * fraction);
  }
  public int getPreferredValue() {
    return (int) Math.round(parent.getPreferredValue() * fraction);
  }
  public int getMinimumValue() {
    return (int) Math.round(parent.getMinimumValue() * fraction);
  }
  public int getMaximumValue() {
    return (int) Math.round(parent.getMaximumValue() * fraction);
  }
  public void setValue(int val) {
    // Uncomment this next line to watch when our spring is resized:
    // System.err.println("Value to setValue: " + val);
    if (val == UNSET) {
      return;
    }
    throw new UnsupportedOperationException(
        "Cannot set value on a derived spring");
  }
  public static FractionSpring half(Spring s) {
    return new FractionSpring(s, 0.5);
  }
}
//CompassScroller.java
//A simple ActionListener that can move the view of a viewport
//north, south, east and west by specified units.
//
class CompassScroller implements ActionListener {
  public static final String NORTH = "North";
  public static final String SOUTH = "South";
  public static final String EAST = "East";
  public static final String WEST = "West";
  private JViewport viewport;
  private Point p;
  public CompassScroller(JViewport viewport) {
    this.viewport = viewport;
    p = new Point();
  }
  public void actionPerformed(ActionEvent ae) {
    Dimension dv = viewport.getViewSize();
    Dimension de = viewport.getExtentSize();
    String command = ae.getActionCommand();
    if (command == NORTH) {
      if (p.y > 9) {
        p.y -= 10;
      }
    } else if (command == SOUTH) {
      if (p.y + de.height < dv.height) {
        p.y += 10;
      }
    } else if (command == EAST) {
      if (p.x + de.width < dv.width) {
        p.x += 10;
      }
    } else if (command == WEST) {
      if (p.x > 9) {
        p.x -= 10;
      }
    }
    viewport.setViewPosition(p);
  }
}