Mega Code Archive

 
Categories / Java / Swing JFC
 

A demonstration of the SpringLayout class

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