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