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() { 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); 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("/catalog.gif")); viewport.setView(new JLabel(icon)); setVisible(true); } public static void main(String args[]) { new CompassButtons(); } }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) { 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); } }
没遇到过这种需求
JButton sb = new JButton("South");
JButton eb = new JButton("East");
JButton wb = new JButton("West");
JViewport viewport = new JViewport(); public CompassButtons() {
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);
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("/catalog.gif"));
viewport.setView(new JLabel(icon)); setVisible(true);
} public static void main(String args[]) {
new CompassButtons();
}
}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) {
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);
}
}