/*
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);
}
}
|