Java/Swing JFC/Layout
Содержание
- 1 A BorderLayout divides the space into five regions: North, West, South, East and Centre.
- 2 Absolute Layout Demo
- 3 Add buttons to all parts of a BorderLayout
- 4 A demonstration of the SpringLayout class
- 5 A horizontal layout layout manager that allocates horizontal space in specified proportions
- 6 A JTextField for displaying insets.
- 7 A test of the BoxLayout manager using the Box utility class
- 8 A test of the box layout manager using the Box utility class 2
- 9 A test of the BoxLayout manager using the Box utility class 3
- 10 A test of the OverlayLayout manager allowing experimentation
- 11 A typical usage of a border layout manager.
- 12 A vertical layout manager similar to java.awt.FlowLayout
- 13 BorderLayout Pane
- 14 Box Layout: Adding struts.
- 15 BoxLayout Alignment
- 16 BoxLayout alignment 2
- 17 BoxLayout Component alignment
- 18 BoxLayout demo 1
- 19 BoxLayout Demo 3
- 20 BoxLayout Demo 4
- 21 BoxLayout: Glue Sample
- 22 Box layout manager using the Box utility class
- 23 BoxLayout Pane
- 24 BoxLayout Sample
- 25 BoxLayout: setAlignmentX setAlignmentY
- 26 BoxLayout X Y alignment
- 27 CardLayout Demo
- 28 Component Alignment
- 29 Demonstrates BorderLayout
- 30 Demonstrates FlowLayout
- 31 Demonstrates GridLayout
- 32 FlowLayout Pane
- 33 GridLayout Demo
- 34 GridLayout Demo 3
- 35 GridLayout Pane
- 36 Laying Out a Screen with CardLayout
- 37 Laying out a screen with SpringLayout
- 38 Laying Out Components in a Flow (Left-to-Right, Top-to-Bottom)
- 39 Laying Out Components in a Grid
- 40 Laying Out Components Using Absolute Coordinates
- 41 Layout: Overlay Sample
- 42 NullLayout Pane
- 43 Rigid areas are like pairs of struts
- 44 Simpler CardLayout demo
- 45 Spring Compact Grid
- 46 Spring Demo 1
- 47 Spring Demo 2
- 48 Spring Demo 3
- 49 Spring Demo 4
- 50 Spring Form
- 51 SpringLayout Utilities
- 52 Use FlowLayout to hold checkBox, Label and TextField
- 53 Use SpringLayout to create a single row of components
- 54 Using CardLayout
- 55 Using Glue
- 56 Various layouts
- 57 Vertical and horizontal BoxLayouts
- 58 Without layout manager, we position components using absolute values.
A BorderLayout divides the space into five regions: North, West, South, East and Centre.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class BorderExample {
public static void main(String[] args) {
JPanel panel = new JPanel(new BorderLayout());
JPanel top = new JPanel();
top.setBackground(Color.gray);
top.setPreferredSize(new Dimension(250, 150));
panel.add(top);
panel.setBorder(new EmptyBorder(new Insets(10, 20, 30, 40)));
JFrame f = new JFrame();
f.add(panel);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Absolute Layout Demo
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
/*
* AbsoluteLayoutDemo.java is a 1.4 application that requires no other files.
*/
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
public class AbsoluteLayoutDemo {
public static void addComponentsToPane(Container pane) {
pane.setLayout(null);
JButton b1 = new JButton("one");
JButton b2 = new JButton("two");
JButton b3 = new JButton("three");
pane.add(b1);
pane.add(b2);
pane.add(b3);
Insets insets = pane.getInsets();
Dimension size = b1.getPreferredSize();
b1.setBounds(25 + insets.left, 5 + insets.top, size.width, size.height);
size = b2.getPreferredSize();
b2
.setBounds(55 + insets.left, 40 + insets.top, size.width,
size.height);
size = b3.getPreferredSize();
b3.setBounds(150 + insets.left, 15 + insets.top, size.width + 50,
size.height + 20);
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("AbsoluteLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
addComponentsToPane(frame.getContentPane());
//Size and display the window.
Insets insets = frame.getInsets();
frame.setSize(300 + insets.left + insets.right, 125 + insets.top
+ insets.bottom);
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Add buttons to all parts of a BorderLayout
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
public class Main extends Frame {
private Button north, south, east, west, center;
public Main(String title) {
super(title);
north = new Button("North");
south = new Button("South");
east = new Button("East");
west = new Button("West");
center = new Button("Center");
this.add(north, BorderLayout.NORTH);
this.add(south, BorderLayout.SOUTH);
this.add(east, BorderLayout.EAST);
this.add(west, BorderLayout.WEST);
this.add(center, BorderLayout.CENTER);
}
public static void main(String[] args) {
Frame f = new Main("BorderLayout demo");
f.pack();
f.setVisible(true);
}
}
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);
}
}
A horizontal layout layout manager that allocates horizontal space in specified proportions
package com.equitysoft.cellspark;
/**
THIS PROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTIES (OR CONDITIONS),
EXPRESS OR IMPLIED WITH RESPECT TO THE PROGRAM, INCLUDING THE IMPLIED WARRANTIES (OR CONDITIONS)
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK ARISING OUT OF USE OR
PERFORMANCE OF THE PROGRAM AND DOCUMENTATION REMAINS WITH THE USER.
*/
import java.awt.*; import java.util.*;
/**
*
* A horizontal layout layout manager that allocates horizontal space in specified proportions.
* The same can be done with GridBagLayout but GridBagLayout has a problem when space is resized
* particularly when moving a JSplitPane divider - the proportions will suddenly change
* for no apparent reason. ProportionalLayout solves the problem.
*
* Revision date 12th July 2001
*
* @author Colin Mummery e-mail: colin_mummery@yahoo.ru Homepage:www.kagi.ru/equitysoft
*/
public class ProportionalLayout implements LayoutManager{
private Hashtable comps;
private int[] proportions;
private int total; //The total of the proportions
private int num; //The number in the array
//Constructors
/**
* Constructs a ProportinalLayout instance with the specified horizontal component proportions
*
* @param proportions An int array of values indicating horizontal proportions. An array of 2,1,1 would
* give the first component added half the space horizontally, the second and the third would each get a quarter.
* More components would not be given any space at all. When there are less than the expected number of components
* the unused values in the proportions array will correspond to blank space in the layout.
*/
public ProportionalLayout(int[] proportions){
this.proportions=proportions;
num=proportions.length;
for(int i=0;i<num;i++){
int prop=proportions[i];
total+=prop;
}
}
//----------------------------------------------------------------------------
private Dimension layoutSize(Container parent,boolean minimum){
Dimension dim=new Dimension(0,0);
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
int cnt=0;
for(int i=0;i<n;i++){
Component c=parent.getComponent(i); int maxhgt=0;
if(c.isVisible()){
Dimension d=(minimum)? c.getMinimumSize() : c.getPreferredSize();
dim.width+=d.width;
if(d.height>dim.height)dim.height=d.height;
}
cnt++; if(cnt==num)break;
}
}
Insets insets=parent.getInsets();
dim.width+=insets.left+insets.right;
dim.height+=insets.top+insets.bottom;
return dim;
}
//-----------------------------------------------------------------------------
/**
* Lays out the container.
*/
public void layoutContainer(Container parent){
Insets insets=parent.getInsets();
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
Dimension pd=parent.getSize();
//do layout
int cnt=0;
int totalwid=pd.width-insets.left-insets.right;
int x=insets.left; int cumwid=0;
for(int i=0;i<n;i++){
Component c=parent.getComponent(i);
int wid=proportions[i]*totalwid/total;
c.setBounds(x,insets.top,wid,pd.height-insets.bottom-insets.top);
x+=wid;
cnt++; if(cnt==num)break;
}
}
}
//-----------------------------------------------------------------------------
public Dimension minimumLayoutSize(Container parent){return layoutSize(parent,false);}
//-----------------------------------------------------------------------------
public Dimension preferredLayoutSize(Container parent){return layoutSize(parent,false);}
//----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void addLayoutComponent(String name,Component comp){}
//-----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void removeLayoutComponent(Component comp){}
//-----------------------------------------------------------------------------
public String toString(){
StringBuffer sb=new StringBuffer();
sb.append(getClass().getName()).append("["); int len=proportions.length;
for(int i=0;i<len;i++){
sb.append("p").append(i).append("=").append(proportions[i]);
if(i!=len-1)sb.append(",");
}
sb.append("]");
return sb.toString();
}
//-----------------------------------------------------------------------------
}
A JTextField for displaying insets.
/*
* JCommon : a free general purpose class library for the Java(tm) platform
*
*
* (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
*
* Project Info: http://www.jfree.org/jcommon/index.html
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
* in the United States and other countries.]
*
* --------------------
* InsetsTextField.java
* --------------------
* (C) Copyright 2000-2008, by Andrzej Porebski.
*
* Original Author: Andrzej Porebski;
* Contributor(s): Arnaud Lelievre;
*
* $Id: InsetsTextField.java,v 1.4 2008/12/18 09:57:32 mungady Exp $
*
* Changes (from 7-Nov-2001)
* -------------------------
* 07-Nov-2001 : Added to com.jrefinery.ui package (DG);
* 08-Sep-2003 : Added internationalization via use of properties
* resourceBundle (RFE 690236) (AL);
* 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
* Jess Thrysoee (DG);
*
*/
import java.awt.Insets;
import java.util.ResourceBundle;
import javax.swing.JTextField;
/**
* A JTextField for displaying insets.
*
* @author Andrzej Porebski
*/
public class InsetsTextField extends JTextField {
/**
* Default constructor. Initializes this text field with formatted string
* describing provided insets.
*
* @param insets the insets.
*/
public InsetsTextField(final Insets insets) {
super();
setInsets(insets);
setEnabled(false);
}
/**
* Returns a formatted string describing provided insets.
*
* @param insets the insets.
*
* @return the string.
*/
public String formatInsetsString(Insets insets) {
insets = (insets == null) ? new Insets(0, 0, 0, 0) : insets;
return
"T" + insets.top + ", "
+ "L" + insets.left + ", "
+ "B" + insets.bottom + ", "
+ "R" + insets.right;
}
/**
* Sets the text of this text field to the formatted string
* describing provided insets. If insets is null, empty insets
* (0,0,0,0) are used.
*
* @param insets the insets.
*/
public void setInsets(final Insets insets) {
setText(formatInsetsString(insets));
}
}
A test of the BoxLayout manager using the Box utility class
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// HBox.java
//A quick test of the BoxLayout manager using the Box utility class.
//
import java.awt.Button;
import java.awt.Panel;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
public class HBox extends JFrame {
public HBox() {
super("Horizontal Box Test Frame");
setSize(200, 100);
Panel box = new Panel();
// Use BoxLayout.Y_AXIS below if you want a vertical box
box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS));
setContentPane(box);
for (int i = 0; i < 3; i++) {
Button b = new Button("B" + i);
box.add(b);
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
HBox bt = new HBox();
}
}
A test of the box layout manager using the Box utility class 2
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// HBoxWithGlue.java
//A quick test of the box layout manager using the Box utility class.
//
import java.awt.Button;
import javax.swing.Box;
import javax.swing.JFrame;
public class HBoxWithGlue extends JFrame {
public HBoxWithGlue() {
super("Box & Glue Frame");
setSize(350, 100);
Box box = Box.createHorizontalBox();
setContentPane(box);
box.add(Box.createHorizontalGlue());
for (int i = 0; i < 3; i++) {
Button b = new Button("B" + i);
box.add(b);
}
box.add(Box.createHorizontalGlue());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
HBoxWithGlue bt = new HBoxWithGlue();
}
}
A test of the BoxLayout manager using the Box utility class 3
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// VBox.java
//A quick test of the BoxLayout manager using the Box utility class.
//This box is laid out vertically.
//
import java.awt.Button;
import java.awt.Panel;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
public class VBox extends JFrame {
public VBox() {
super("Vertical Box Test Frame");
setSize(200, 100);
Panel box = new Panel();
// Use BoxLayout.X_AXIS below if you want a horizontal box
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
setContentPane(box);
for (int i = 0; i < 3; i++) {
Button b = new Button("B" + i);
box.add(b);
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
VBox bt = new VBox();
}
}
A test of the OverlayLayout manager allowing experimentation
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
//OverlayTest.java
//A test of the OverlayLayout manager allowing experimentation.
//
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.OverlayLayout;
public class OverlayTest extends JFrame {
public OverlayTest() {
super("OverlayLayout Test");
setSize(500, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
final Container c = getContentPane();
c.setLayout(new GridBagLayout());
final JPanel p1 = new GridPanel();
final OverlayLayout overlay = new OverlayLayout(p1);
p1.setLayout(overlay);
final JButton jb1 = new JButton("B1");
final JButton jb2 = new JButton("B2");
final JButton jb3 = new JButton("B3");
Dimension b1 = new Dimension(60, 50);
Dimension b2 = new Dimension(80, 40);
Dimension b3 = new Dimension(100, 60);
jb1.setMinimumSize(b1);
jb1.setMaximumSize(b1);
jb1.setPreferredSize(b1);
jb2.setMinimumSize(b2);
jb2.setMaximumSize(b2);
jb2.setPreferredSize(b2);
jb3.setMinimumSize(b3);
jb3.setMaximumSize(b3);
jb3.setPreferredSize(b3);
SimpleReporter reporter = new SimpleReporter();
jb1.addActionListener(reporter);
jb2.addActionListener(reporter);
jb3.addActionListener(reporter);
p1.add(jb1);
p1.add(jb2);
p1.add(jb3);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(2,6));
p2.add(new JLabel("B1 X", JLabel.CENTER));
p2.add(new JLabel("B1 Y", JLabel.CENTER));
p2.add(new JLabel("B2 X", JLabel.CENTER));
p2.add(new JLabel("B2 Y", JLabel.CENTER));
p2.add(new JLabel("B3 X", JLabel.CENTER));
p2.add(new JLabel("B3 Y", JLabel.CENTER));
p2.add(new JLabel(""));
final JTextField x1 = new JTextField("0.0", 4); // Button1 x alignment
final JTextField y1 = new JTextField("0.0", 4); // Button1 y alignment
final JTextField x2 = new JTextField("0.0", 4);
final JTextField y2 = new JTextField("0.0", 4);
final JTextField x3 = new JTextField("0.0", 4);
final JTextField y3 = new JTextField("0.0", 4);
p2.add(x1);
p2.add(y1);
p2.add(x2);
p2.add(y2);
p2.add(x3);
p2.add(y3);
GridBagConstraints constraints = new GridBagConstraints();
c.add(p1, constraints);
constraints.gridx = 1;
JButton updateButton = new JButton("Update");
updateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
jb1.setAlignmentX(
Float.valueOf(x1.getText().trim()).floatValue());
jb1.setAlignmentY(
Float.valueOf(y1.getText().trim()).floatValue());
jb2.setAlignmentX(
Float.valueOf(x2.getText().trim()).floatValue());
jb2.setAlignmentY(
Float.valueOf(y2.getText().trim()).floatValue());
jb3.setAlignmentX(
Float.valueOf(x3.getText().trim()).floatValue());
jb3.setAlignmentY(
Float.valueOf(y3.getText().trim()).floatValue());
p1.revalidate();
}
});
c.add(updateButton, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 2;
c.add(p2, constraints);
}
public static void main(String args[]) {
OverlayTest ot = new OverlayTest();
ot.setVisible(true);
}
public class SimpleReporter implements ActionListener {
public void actionPerformed(ActionEvent ae) {
System.out.println(ae.getActionCommand());
}
}
public class GridPanel extends JPanel {
public void paint(Graphics g) {
super.paint(g);
int w = getSize().width;
int h = getSize().height;
g.setColor(Color.red);
g.drawRect(0,0,w-1,h-1);
g.drawLine(w/2,0,w/2,h);
g.drawLine(0,h/2,w,h/2);
}
}
}
A typical usage of a border layout manager.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Insets;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class BorderLayoutExample {
public static void main(String[] args) {
JFrame f = new JFrame();
JMenuBar menubar = new JMenuBar();
JMenu file = new JMenu("File");
menubar.add(file);
f.setJMenuBar(menubar);
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
JButton bexit = new JButton(new ImageIcon("exit.png"));
bexit.setBorder(new EmptyBorder(0, 0, 0, 0));
toolbar.add(bexit);
f.add(toolbar, BorderLayout.NORTH);
JToolBar vertical = new JToolBar(JToolBar.VERTICAL);
vertical.setFloatable(false);
vertical.setMargin(new Insets(10, 5, 5, 5));
JButton selectb = new JButton(new ImageIcon("a.png"));
selectb.setBorder(new EmptyBorder(3, 0, 3, 0));
JButton freehandb = new JButton(new ImageIcon("b.png"));
freehandb.setBorder(new EmptyBorder(3, 0, 3, 0));
JButton shapeedb = new JButton(new ImageIcon("c.png"));
shapeedb.setBorder(new EmptyBorder(3, 0, 3, 0));
vertical.add(selectb);
vertical.add(freehandb);
vertical.add(shapeedb);
f.add(vertical, BorderLayout.WEST);
f.add(new JTextArea(), BorderLayout.CENTER);
JLabel statusbar = new JLabel(" Statusbar");
statusbar.setPreferredSize(new Dimension(-1, 22));
statusbar.setBorder(LineBorder.createGrayLineBorder());
f.add(statusbar, BorderLayout.SOUTH);
f.setSize(350, 300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
A vertical layout manager similar to java.awt.FlowLayout
/**
THIS PROGRAM IS PROVIDED "AS IS" WITHOUT ANY WARRANTIES (OR CONDITIONS),
EXPRESS OR IMPLIED WITH RESPECT TO THE PROGRAM, INCLUDING THE IMPLIED WARRANTIES (OR CONDITIONS)
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK ARISING OUT OF USE OR
PERFORMANCE OF THE PROGRAM AND DOCUMENTATION REMAINS WITH THE USER.
*/
import java.awt.*; import java.util.*;
/**
*
* A vertical layout manager similar to java.awt.FlowLayout.
* Like FlowLayout components do not expand to fill available space except when the horizontal alignment
* is <code>BOTH</code>
* in which case components are stretched horizontally. Unlike FlowLayout, components will not wrap to form another
* column if there isn"t enough space vertically. VerticalLayout can optionally anchor components to the top or bottom
* of the display area or center them between the top and bottom.
*
* Revision date 12th July 2001
*
* @author Colin Mummery e-mail: colin_mummery@yahoo.ru Homepage:www.kagi.ru/equitysoft -
* Based on "FlexLayout" in Java class libraries Vol 2 Chan/Lee Addison-Wesley 1998
*/
public class VerticalLayout implements LayoutManager{
/**
* The horizontal alignment constant that designates centering. Also used to designate center anchoring.
*/
public final static int CENTER=0;
/**
* The horizontal alignment constant that designates right justification.
*/
public final static int RIGHT=1;
/**
* The horizontal alignment constant that designates left justification.
*/
public final static int LEFT=2;
/**
* The horizontal alignment constant that designates stretching the component horizontally.
*/
public final static int BOTH=3;
/**
* The anchoring constant that designates anchoring to the top of the display area
*/
public final static int TOP=1;
/**
* The anchoring constant that designates anchoring to the bottom of the display area
*/
public final static int BOTTOM=2;
private int vgap; //the vertical vgap between components...defaults to 5
private int alignment; //LEFT, RIGHT, CENTER or BOTH...how the components are justified
private int anchor; //TOP, BOTTOM or CENTER ...where are the components positioned in an overlarge space
private Hashtable comps;
//Constructors
/**
* Constructs an instance of VerticalLayout with a vertical vgap of 5 pixels, horizontal centering and anchored to
* the top of the display area.
*/
public VerticalLayout(){
this(5,CENTER,TOP);
}
/**
* Constructs a VerticalLayout instance with horizontal centering, anchored to the top with the specified vgap
*
* @param vgap An int value indicating the vertical seperation of the components
*/
public VerticalLayout(int vgap){
this(vgap,CENTER,TOP);
}
/**
* Constructs a VerticalLayout instance anchored to the top with the specified vgap and horizontal alignment
*
* @param vgap An int value indicating the vertical seperation of the components
* @param alignment An int value which is one of <code>RIGHT, LEFT, CENTER, BOTH</code> for the horizontal alignment.
*/
public VerticalLayout(int vgap,int alignment){
this(vgap,alignment,TOP);
}
/**
* Constructs a VerticalLayout instance with the specified vgap, horizontal alignment and anchoring
*
* @param vgap An int value indicating the vertical seperation of the components
* @param alignment An int value which is one of <code>RIGHT, LEFT, CENTER, BOTH</code> for the horizontal alignment.
* @param anchor An int value which is one of <code>TOP, BOTTOM, CENTER</code> indicating where the components are
* to appear if the display area exceeds the minimum necessary.
*/
public VerticalLayout(int vgap,int alignment,int anchor){
this.vgap=vgap; this.alignment=alignment; this.anchor=anchor;
}
//----------------------------------------------------------------------------
private Dimension layoutSize(Container parent,boolean minimum){
Dimension dim=new Dimension(0,0);
Dimension d;
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
for(int i=0;i<n;i++){
Component c=parent.getComponent(i);
if(c.isVisible()){
d=minimum ? c.getMinimumSize() : c.getPreferredSize();
dim.width=Math.max(dim.width,d.width); dim.height+=d.height;
if(i>0)dim.height+=vgap;
}
}
}
Insets insets=parent.getInsets();
dim.width+=insets.left+insets.right;
dim.height+=insets.top+insets.bottom+vgap+vgap;
return dim;
}
//-----------------------------------------------------------------------------
/**
* Lays out the container.
*/
public void layoutContainer(Container parent){
Insets insets=parent.getInsets();
synchronized(parent.getTreeLock()){
int n=parent.getComponentCount();
Dimension pd=parent.getSize(); int y=0;
//work out the total size
for(int i=0;i<n;i++){
Component c=parent.getComponent(i);
Dimension d=c.getPreferredSize();
y+=d.height+vgap;
}
y-=vgap; //otherwise there"s a vgap too many
//Work out the anchor paint
if(anchor==TOP)y=insets.top;
else if(anchor==CENTER)y=(pd.height-y)/2;
else y=pd.height-y-insets.bottom;
//do layout
for(int i=0;i<n;i++){
Component c=parent.getComponent(i);
Dimension d=c.getPreferredSize();
int x=insets.left; int wid=d.width;
if(alignment==CENTER)x=(pd.width-d.width)/2;
else if(alignment==RIGHT)x=pd.width-d.width-insets.right;
else if(alignment==BOTH)wid=pd.width-insets.left-insets.right;
c.setBounds(x,y,wid,d.height);
y+=d.height+vgap;
}
}
}
//-----------------------------------------------------------------------------
public Dimension minimumLayoutSize(Container parent){return layoutSize(parent,false);}
//-----------------------------------------------------------------------------
public Dimension preferredLayoutSize(Container parent){return layoutSize(parent,false);}
//----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void addLayoutComponent(String name,Component comp){}
//-----------------------------------------------------------------------------
/**
* Not used by this class
*/
public void removeLayoutComponent(Component comp){}
//-----------------------------------------------------------------------------
public String toString(){return getClass().getName()+"[vgap="+vgap+" align="+alignment+" anchor="+anchor+"]";}
}
BorderLayout Pane
/*
* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BorderLayoutPane extends JPanel {
String[] borders = { "North", "East", "South", "West", "Center" };
public BorderLayoutPane() {
// Use a BorderLayout with 10-pixel margins between components
this.setLayout(new BorderLayout(10, 10));
for (int i = 0; i < 5; i++) { // Add children to the pane
this.add(new JButton(borders[i]), // Add this component
borders[i]); // Using this constraint
}
}
public static void main(String[] a) {
JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setContentPane(new BorderLayoutPane());
f.pack();
f.setVisible(true);
}
}
Box Layout: Adding struts.
// : c14:Box2.java
// Adding struts.
// <applet code=Box2 width=450 height=300></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.Box;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Box2 extends JApplet {
public void init() {
Box bv = Box.createVerticalBox();
for (int i = 0; i < 5; i++) {
bv.add(new JButton("bv " + i));
bv.add(Box.createVerticalStrut(i * 10));
}
Box bh = Box.createHorizontalBox();
for (int i = 0; i < 5; i++) {
bh.add(new JButton("bh " + i));
bh.add(Box.createHorizontalStrut(i * 10));
}
Container cp = getContentPane();
cp.add(BorderLayout.EAST, bv);
cp.add(BorderLayout.SOUTH, bh);
}
public static void main(String[] args) {
run(new Box2(), 450, 300);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
BoxLayout Alignment
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class YAxisAlignXButtonMixed {
static public class AButton extends Button {
float alignment;
AButton(String label, float alignment) {
super(label);
this.alignment = alignment;
}
public float getAlignmentX() {
return alignment;
}
}
private static Container makeIt(String title) {
JPanel container = new JPanel();
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
container.setLayout(layout);
AButton button = new AButton("0.0", 0.0f);
container.add(button);
button = new AButton(".25", .25f);
container.add(button);
button = new AButton(".50", .50f);
container.add(button);
button = new AButton(".75", .75f);
container.add(button);
button = new AButton("1.0", 1.0f);
container.add(button);
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel = makeIt("AWT Button");
Container contentPane = frame.getContentPane();
contentPane.add(panel, BorderLayout.CENTER);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
BoxLayout alignment 2
import java.awt.BorderLayout;
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class XAxisDiffAlign {
private static Container makeIt(String title, boolean more) {
JPanel container = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
int width = getWidth();
int height = getHeight() - insets.top - insets.bottom;
int halfHeight = height / 2 + insets.top;
g.drawLine(0, halfHeight, width, halfHeight);
}
};
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.X_AXIS);
container.setLayout(layout);
JButton button;
button = new JButton("0.0");
button.setOpaque(false);
button.setAlignmentY(Component.TOP_ALIGNMENT);
container.add(button);
if (more) {
button = new JButton(".25");
button.setOpaque(false);
button.setAlignmentY(0.25f);
container.add(button);
button = new JButton(".5");
button.setOpaque(false);
button.setAlignmentY(Component.CENTER_ALIGNMENT);
container.add(button);
button = new JButton(".75");
button.setOpaque(false);
button.setAlignmentY(0.75f);
container.add(button);
}
button = new JButton("1.0");
button.setOpaque(false);
button.setAlignmentY(Component.BOTTOM_ALIGNMENT);
container.add(button);
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel1 = makeIt("Mixed", false);
Container panel2 = makeIt("Mixed", true);
Container contentPane = frame.getContentPane();
contentPane.add(panel1, BorderLayout.WEST);
contentPane.add(panel2, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
}
BoxLayout Component alignment
import java.awt.ruponent;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class YAxisAlignX {
private static Container makeIt(String title, float alignment) {
String labels[] = { "--", "----", "--------", "------------" };
JPanel container = new JPanel();
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
container.setLayout(layout);
for (int i = 0, n = labels.length; i < n; i++) {
JButton button = new JButton(labels[i]);
button.setAlignmentX(alignment);
container.add(button);
}
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel1 = makeIt("Left", Component.LEFT_ALIGNMENT);
Container panel2 = makeIt("Center", Component.CENTER_ALIGNMENT);
Container panel3 = makeIt("Right", Component.RIGHT_ALIGNMENT);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.add(panel1);
contentPane.add(panel2);
contentPane.add(panel3);
frame.pack();
frame.setVisible(true);
}
}
BoxLayout demo 1
import java.awt.Container;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
public class BoxLayoutTest extends JFrame implements ActionListener {
private Box horizontalBox;
private Box verticalBox;
private Box horizontalStrutsAndGlueBox;
private Box verticalStrutsAndGlueBox;
private Box currentBox;
private JCheckBox strutsAndGlueCheckBox;
private JRadioButton horizontalButton;
private JRadioButton verticalButton;
public BoxLayoutTest() {
setTitle("BoxLayoutTest");
setSize(300, 300);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
horizontalBox = createBox(true, false);
verticalBox = createBox(false, false);
horizontalStrutsAndGlueBox = createBox(true, true);
verticalStrutsAndGlueBox = createBox(false, true);
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 1, 3, 3));
ButtonGroup directionGroup = new ButtonGroup();
horizontalButton = addRadioButton(panel, directionGroup, "Horizontal",
true);
verticalButton = addRadioButton(panel, directionGroup, "Vertical",
false);
strutsAndGlueCheckBox = addCheckBox(panel, "Struts and Glue");
Container contentPane = getContentPane();
contentPane.add(panel, "South");
contentPane.add(horizontalBox, "Center");
currentBox = horizontalBox;
}
public Box createBox(boolean horizontal, boolean strutsAndGlue) {
Box b;
if (horizontal)
b = Box.createHorizontalBox();
else
b = Box.createVerticalBox();
b.add(new JLabel("Name: "));
b.add(new JTextField());
if (strutsAndGlue)
if (horizontal)
b.add(Box.createHorizontalStrut(5));
else
b.add(Box.createVerticalStrut(5));
b.add(new JLabel("Password: "));
b.add(new JTextField());
if (strutsAndGlue)
b.add(Box.createGlue());
b.add(new JButton("Ok"));
return b;
}
public JRadioButton addRadioButton(JPanel p, ButtonGroup g, String name,
boolean selected) {
JRadioButton button = new JRadioButton(name, selected);
button.addActionListener(this);
g.add(button);
p.add(button);
return button;
}
public JCheckBox addCheckBox(JPanel p, String name) {
JCheckBox checkBox = new JCheckBox(name);
checkBox.addActionListener(this);
p.add(checkBox);
return checkBox;
}
public void actionPerformed(ActionEvent evt) {
Container contentPane = getContentPane();
contentPane.remove(currentBox);
if (horizontalButton.isSelected()) {
if (strutsAndGlueCheckBox.isSelected()) {
currentBox = horizontalStrutsAndGlueBox;
} else {
currentBox = horizontalBox;
}
} else {
if (strutsAndGlueCheckBox.isSelected()) {
currentBox = verticalStrutsAndGlueBox;
} else {
currentBox = verticalBox;
}
}
contentPane.add(currentBox, "Center");
contentPane.validate();
repaint();
}
public static void main(String[] args) {
JFrame f = new BoxLayoutTest();
f.show();
}
}
BoxLayout Demo 3
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class StrutSample {
public static void main(String args[]) {
Box horizontalBox;
JPanel panel;
JFrame frame = new JFrame("Horizontal Strut");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(0, 1));
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalStrut(10));
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("Beginning Strut"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JButton("Left"));
horizontalBox.add(Box.createHorizontalStrut(10));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(Box.createHorizontalStrut(25));
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("2 Middle Struts"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalStrut(25));
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
horizontalBox.add(Box.createHorizontalStrut(10));
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel.setBorder(BorderFactory
.createTitledBorder("Beginning/End Struts"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
horizontalBox.add(Box.createHorizontalStrut(10));
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("End Strut"));
contentPane.add(panel);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
BoxLayout Demo 4
import java.awt.Color;
import java.awt.ruponent;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BoxLayoutDemo {
private static JComponent createComponent(String s) {
JLabel l = new JLabel(s);
l.setBorder(BorderFactory
.createMatteBorder(5, 5, 5, 5, Color.DARK_GRAY));
l.setHorizontalAlignment(JLabel.CENTER);
l.setAlignmentX(Component.CENTER_ALIGNMENT); //use middle of row
return l;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
p.add(createComponent("Component 1"));
p.add(Box.createVerticalGlue());
p.add(createComponent("Component 2"));
p.add(createComponent("Component 3"));
p.add(createComponent("Component 4"));
frame.setContentPane(p);
//Display the window.
frame.pack();
frame.setVisible(true);
}
}
BoxLayout: Glue Sample
/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski
ISBN: 1-893115-78-X
Publisher: APress
*/
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GlueSample {
public static void main(String args[]) {
Box horizontalBox;
JPanel panel;
JFrame frame = new JFrame("Horizontal Glue");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(0, 1));
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createGlue());
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("Beginning Glue"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JButton("Left"));
horizontalBox.add(Box.createGlue());
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(Box.createGlue());
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("2 Middle Glues"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createGlue());
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
horizontalBox.add(Box.createGlue());
panel = new JPanel(new BorderLayout());
panel.add(horizontalBox);
panel
.setBorder(BorderFactory
.createTitledBorder("Beginning/End Glues"));
contentPane.add(panel);
horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JButton("Left"));
horizontalBox.add(new JButton("Middle"));
horizontalBox.add(new JButton("Right"));
panel = new JPanel(new BorderLayout());
horizontalBox.add(Box.createGlue());
panel.add(horizontalBox);
panel.setBorder(BorderFactory.createTitledBorder("End Glue"));
contentPane.add(panel);
frame.setSize(300, 300);
frame.setVisible(true);
}
}
Box layout manager using the Box utility class
/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O"Reilly
*/
// HBoxWithStrut.java
//Another test of the box layout manager using the Box utility class.
//This version separates several components with a fixed width gap.
//
import java.awt.Button;
import javax.swing.Box;
import javax.swing.JFrame;
public class HBoxWithStrut extends JFrame {
public HBoxWithStrut() {
super("Box & Strut Frame");
setSize(370, 80);
Box box = Box.createHorizontalBox();
setContentPane(box);
for (int i = 0; i < 3; i++) {
Button b = new Button("B" + i);
box.add(b);
}
// Add a spacer between the first three buttons and the last three
box.add(Box.createHorizontalStrut(10));
for (int i = 3; i < 6; i++) {
Button b = new Button("B" + i);
box.add(b);
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]) {
HBoxWithStrut bt = new HBoxWithStrut();
}
}
BoxLayout Pane
/*
* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
public class BoxLayoutPane extends JPanel {
public BoxLayoutPane() {
// Use a BorderLayout layout manager to arrange various Box components
this.setLayout(new BorderLayout());
// Give the entire panel a margin by adding an empty border
// We could also do this by overriding getInsets()
this.setBorder(new EmptyBorder(10, 10, 10, 10));
// Add a plain row of buttons along the top of the pane
Box row = Box.createHorizontalBox();
for (int i = 0; i < 4; i++) {
JButton b = new JButton("B" + i);
b.setFont(new Font("serif", Font.BOLD, 12 + i * 2));
row.add(b);
}
this.add(row, BorderLayout.NORTH);
// Add a plain column of buttons along the right edge
// Use BoxLayout with a different kind of Swing container
// Give the column a border: can"t do this with the Box class
JPanel col = new JPanel();
col.setLayout(new BoxLayout(col, BoxLayout.Y_AXIS));
col.setBorder(new TitledBorder(new EtchedBorder(), "Column"));
for (int i = 0; i < 4; i++) {
JButton b = new JButton("Button " + i);
b.setFont(new Font("sanserif", Font.BOLD, 10 + i * 2));
col.add(b);
}
this.add(col, BorderLayout.EAST); // Add column to right of panel
// Add a button box along the bottom of the panel.
// Use "Glue" to space the buttons evenly
Box buttonbox = Box.createHorizontalBox();
buttonbox.add(Box.createHorizontalGlue()); // stretchy space
buttonbox.add(new JButton("Okay"));
buttonbox.add(Box.createHorizontalGlue()); // stretchy space
buttonbox.add(new JButton("Cancel"));
buttonbox.add(Box.createHorizontalGlue()); // stretchy space
buttonbox.add(new JButton("Help"));
buttonbox.add(Box.createHorizontalGlue()); // stretchy space
this.add(buttonbox, BorderLayout.SOUTH);
// Create a component to display in the center of the panel
JTextArea textarea = new JTextArea();
textarea.setText("This component has 12-pixel margins on left and top"
+ " and has 72-pixel margins on right and bottom.");
textarea.setLineWrap(true);
textarea.setWrapStyleWord(true);
// Use Box objects to give the JTextArea an unusual spacing
// First, create a column with 3 kids. The first and last kids
// are rigid spaces. The middle kid is the text area
Box fixedcol = Box.createVerticalBox();
fixedcol.add(Box.createVerticalStrut(12)); // 12 rigid pixels
fixedcol.add(textarea); // Component fills in the rest
fixedcol.add(Box.createVerticalStrut(72)); // 72 rigid pixels
// Now create a row. Give it rigid spaces on the left and right,
// and put the column from above in the middle.
Box fixedrow = Box.createHorizontalBox();
fixedrow.add(Box.createHorizontalStrut(12));
fixedrow.add(fixedcol);
fixedrow.add(Box.createHorizontalStrut(72));
// Now add the JTextArea in the column in the row to the panel
this.add(fixedrow, BorderLayout.CENTER);
}
public static void main(String[] a) {
JFrame f = new JFrame();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setContentPane(new BoxLayoutPane());
f.pack();
f.setVisible(true);
}
}
BoxLayout Sample
import java.awt.BorderLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class BoxLayoutSample {
public static void main(String args[]) {
JFrame verticalFrame = new JFrame("Vertical");
verticalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Box verticalBox = Box.createVerticalBox();
verticalBox.add(new JLabel("Top"));
verticalBox.add(new JTextField("Middle"));
verticalBox.add(new JButton("Bottom"));
verticalFrame.getContentPane().add(verticalBox, BorderLayout.CENTER);
verticalFrame.setSize(150, 150);
verticalFrame.setVisible(true);
JFrame horizontalFrame = new JFrame("Horizontal");
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(new JLabel("Left"));
horizontalBox.add(new JTextField("Middle"));
horizontalBox.add(new JButton("Right"));
horizontalFrame.getContentPane()
.add(horizontalBox, BorderLayout.CENTER);
horizontalFrame.setSize(150, 150);
horizontalFrame.setVisible(true);
}
}
BoxLayout: setAlignmentX setAlignmentY
/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski
ISBN: 1-893115-78-X
Publisher: APress
*/
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Dimension;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoxSample {
public static void main(String args[]) {
JButton button;
Vector buttons = new Vector();
Dimension dim;
JFrame frame = new JFrame("Box Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
JPanel topLeft = new JPanel();
topLeft.setLayout(new BoxLayout(topLeft, BoxLayout.X_AXIS));
topLeft.add(button = new JButton("One"));
buttons.add(button);
changeBoth(button);
topLeft.add(button = new JButton("Two"));
buttons.add(button);
changeBoth(button);
changeWidth(topLeft);
JPanel bottomLeft = new JPanel();
bottomLeft.setLayout(new BoxLayout(bottomLeft, BoxLayout.X_AXIS));
bottomLeft.add(button = new JButton("Six"));
buttons.add(button);
changeBoth(button);
bottomLeft.add(button = new JButton("Seven"));
buttons.add(button);
changeBoth(button);
changeWidth(bottomLeft);
JPanel left = new JPanel();
left.setLayout(new BoxLayout(left, BoxLayout.Y_AXIS));
left.add(topLeft);
left.add(button = new JButton("Four"));
buttons.add(button);
changeBoth(button);
left.add(bottomLeft);
changeBoth(left);
JPanel right = new JPanel();
right.setLayout(new BoxLayout(right, BoxLayout.Y_AXIS));
right.add(button = new JButton("Three"));
buttons.add(button);
changeWidth(button);
right.add(button = new JButton("Five"));
buttons.add(button);
changeBoth(button);
changeBoth(right);
contentPane.add(left);
contentPane.add(right);
tweak(buttons);
frame.pack();
frame.setVisible(true);
}
private static void changeWidth(JComponent comp) {
comp.setAlignmentX(Component.CENTER_ALIGNMENT);
comp.setAlignmentY(Component.CENTER_ALIGNMENT);
Dimension dim = comp.getPreferredSize();
dim.width = Integer.MAX_VALUE;
comp.setMaximumSize(dim);
}
private static void changeHeight(JComponent comp) {
comp.setAlignmentX(Component.CENTER_ALIGNMENT);
comp.setAlignmentY(Component.CENTER_ALIGNMENT);
Dimension dim = comp.getPreferredSize();
dim.height = Integer.MAX_VALUE;
comp.setMaximumSize(dim);
}
private static void changeBoth(JComponent comp) {
comp.setAlignmentX(Component.CENTER_ALIGNMENT);
comp.setAlignmentY(Component.CENTER_ALIGNMENT);
Dimension dim = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
comp.setMaximumSize(dim);
}
private static void tweak(Vector buttons) {
// calc max preferred width
JButton button;
Dimension dim;
int maxWidth = 0;
Enumeration e = buttons.elements();
while (e.hasMoreElements()) {
button = (JButton) e.nextElement();
dim = button.getPreferredSize();
if (dim.width > maxWidth)
maxWidth = dim.width;
}
// set max preferred width
e = buttons.elements();
while (e.hasMoreElements()) {
button = (JButton) e.nextElement();
dim = button.getPreferredSize();
dim.width = maxWidth;
button.setPreferredSize(dim);
}
}
}
BoxLayout X Y alignment
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class YAxisAlignXButton {
private static Container makeIt(String title) {
String labels[] = { "--", "----", "--------", "------------" };
JPanel container = new JPanel();
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
container.setLayout(layout);
for (int i = 0, n = labels.length; i < n; i++) {
Button button = new Button(labels[i]);
// Use default alignment - same for all
container.add(button);
}
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel = makeIt("AWT Button");
Container contentPane = frame.getContentPane();
contentPane.add(panel, BorderLayout.CENTER);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
CardLayout Demo
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class CardLayoutDemo implements ActionListener {
JPanel cards; //a panel that uses CardLayout
final static String[] strings =
{"Component 1",
"Component 2 is so long-winded it makes the container wide",
"Component 3"};
private static JComponent createComponent(String s) {
JLabel l = new JLabel(s);
l.setBorder(BorderFactory.createMatteBorder(5,5,5,5,
Color.DARK_GRAY));
l.setHorizontalAlignment(JLabel.CENTER);
return l;
}
public void addCardsToPane(Container pane) {
JRadioButton[] rb = new JRadioButton[strings.length];
ButtonGroup group = new ButtonGroup();
JPanel buttons = new JPanel();
buttons.setLayout(new BoxLayout(buttons,
BoxLayout.PAGE_AXIS));
for (int i= 0; i < strings.length; i++) {
rb[i] = new JRadioButton("Show component #" + (i+1));
rb[i].setActionCommand(String.valueOf(i));
rb[i].addActionListener(this);
group.add(rb[i]);
buttons.add(rb[i]);
}
rb[0].setSelected(true);
//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
for (int i = 0; i < strings.length; i++) {
cards.add(createComponent(strings[i]), String.valueOf(i));
}
pane.add(buttons, BorderLayout.NORTH);
pane.add(cards, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent evt) {
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getActionCommand());
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CardLayoutDemo demo = new CardLayoutDemo();
demo.addCardsToPane(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}
}
Component Alignment
/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski
ISBN: 1-893115-78-X
Publisher: APress
*/
import java.awt.ruponent;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class YAxisDiffAlign {
private static Container makeIt(String title, boolean more) {
JPanel container = new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Insets insets = getInsets();
int width = getWidth() - insets.left - insets.right;
int halfWidth = width / 2 + insets.left;
int height = getHeight();
int halfHeight = height / 2 + insets.top;
g.drawLine(halfWidth, 0, halfWidth, height);
}
};
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.Y_AXIS);
container.setLayout(layout);
JButton button;
button = new JButton("0.0");
button.setOpaque(false);
button.setAlignmentX(Component.LEFT_ALIGNMENT);
container.add(button);
if (more) {
button = new JButton(".25");
button.setOpaque(false);
button.setAlignmentX(0.25f);
container.add(button);
button = new JButton(".5");
button.setOpaque(false);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
container.add(button);
button = new JButton(".75");
button.setOpaque(false);
button.setAlignmentX(0.75f);
container.add(button);
}
button = new JButton("1.0");
button.setOpaque(false);
button.setAlignmentX(Component.RIGHT_ALIGNMENT);
container.add(button);
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel1 = makeIt("Mixed", false);
Container panel2 = makeIt("Mixed", true);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(1, 2));
contentPane.add(panel1);
contentPane.add(panel2);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
Demonstrates BorderLayout
// : c14:BorderLayout1.java
// Demonstrates BorderLayout.
//<applet code=BorderLayout1 width=300 height=250></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class BorderLayout1 extends JApplet {
public void init() {
Container cp = getContentPane();
cp.add(BorderLayout.NORTH, new JButton("North"));
cp.add(BorderLayout.SOUTH, new JButton("South"));
cp.add(BorderLayout.EAST, new JButton("East"));
cp.add(BorderLayout.WEST, new JButton("West"));
cp.add(BorderLayout.CENTER, new JButton("Center"));
}
public static void main(String[] args) {
run(new BorderLayout1(), 300, 250);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
Demonstrates FlowLayout
// : c14:FlowLayout1.java
// Demonstrates FlowLayout.
// <applet code=FlowLayout1 width=300 height=250></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FlowLayout1 extends JApplet {
public void init() {
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
for (int i = 0; i < 20; i++)
cp.add(new JButton("Button " + i));
}
public static void main(String[] args) {
run(new FlowLayout1(), 300, 250);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
Demonstrates GridLayout
// : c14:GridLayout1.java
// Demonstrates GridLayout.
// <applet code=GridLayout1 width=300 height=250></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GridLayout1 extends JApplet {
public void init() {
Container cp = getContentPane();
cp.setLayout(new GridLayout(7, 3));
for (int i = 0; i < 20; i++)
cp.add(new JButton("Button " + i));
}
public static void main(String[] args) {
run(new GridLayout1(), 300, 250);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
FlowLayout Pane
/*
* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FlowLayoutPane extends JPanel {
public FlowLayoutPane() {
// Use a FlowLayout layout manager. Left justify rows.
// Leave 10 pixels of horizontal and vertical space between components.
this.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
// Add some buttons to demonstrate the layout.
String spaces = ""; // Used to make the buttons different
for (int i = 1; i <= 9; i++) {
this.add(new JButton("Button #" + i + spaces));
spaces += " ";
}
// Give ourselves a default size
this.setPreferredSize(new Dimension(500, 200));
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new FlowLayoutPane(), BorderLayout.CENTER);
// Finally, set the size of the main window, and pop it up.
frame.setSize(600, 400);
frame.setVisible(true);
}
}
GridLayout Demo
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GridLayoutDemo {
private static JComponent createComponent(String s) {
JLabel l = new JLabel(s);
l.setBorder(BorderFactory
.createMatteBorder(5, 5, 5, 5, Color.DARK_GRAY));
l.setHorizontalAlignment(JLabel.CENTER);
return l;
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new GridLayout(1, 0));
p.add(createComponent("Component 1"));
p.add(createComponent("Component 2"));
p.add(createComponent("Component 3"));
p.add(createComponent("Component 4"));
frame.setContentPane(p);
//Display the window.
frame.pack();
frame.setVisible(true);
}
}
GridLayout Demo 3
import java.awt.ruponent;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class XAxisAlignY {
private static Container makeIt(String title, float alignment) {
String labels[] = { "--", "--", "--" };
JPanel container = new JPanel();
container.setBorder(BorderFactory.createTitledBorder(title));
BoxLayout layout = new BoxLayout(container, BoxLayout.X_AXIS);
container.setLayout(layout);
for (int i = 0, n = labels.length; i < n; i++) {
JButton button = new JButton(labels[i]);
button.setAlignmentY(alignment);
container.add(button);
}
return container;
}
public static void main(String args[]) {
JFrame frame = new JFrame("Alignment Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container panel1 = makeIt("Top", Component.TOP_ALIGNMENT);
Container panel2 = makeIt("Center", Component.CENTER_ALIGNMENT);
Container panel3 = makeIt("Bottom", Component.BOTTOM_ALIGNMENT);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(1, 3));
contentPane.add(panel1);
contentPane.add(panel2);
contentPane.add(panel3);
frame.setSize(423, 171);
frame.setVisible(true);
}
}
GridLayout Pane
/*
* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GridLayoutPane extends JPanel {
public GridLayoutPane() {
// Layout components into a grid three columns wide, with the number
// of rows depending on the number of components. Leave 10 pixels
// of horizontal and vertical space between components
this.setLayout(new GridLayout(0, 3, 10, 10));
// Add some components
for (int i = 1; i <= 12; i++)
this.add(new JButton("Button #" + i));
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new GridLayoutPane(), BorderLayout.CENTER);
// Finally, set the size of the main window, and pop it up.
frame.setSize(600, 400);
frame.setVisible(true);
}
}
Laying Out a Screen with CardLayout
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class CardLayoutTest {
public static void main(String args[]) {
JFrame frame = new JFrame("Card Layout");
final Container contentPane = frame.getContentPane();
final CardLayout layout = new CardLayout();
contentPane.setLayout(layout);
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
layout.next(contentPane);
}
};
for (int i = 0; i < 5; i++) {
String label = "Card " + i;
JButton button = new JButton(label);
contentPane.add(button, label);
button.addActionListener(listener);
}
frame.setSize(300, 200);
frame.show();
}
}
Laying out a screen with SpringLayout
import java.awt.ruponent;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
public class SpringFormTest {
public static void main(String args[]) {
JFrame frame = new JFrame("Spring");
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
Component left = new JLabel("Left");
Component right = new JTextField(15);
contentPane.add(left);
contentPane.add(right);
layout.putConstraint(SpringLayout.WEST, left, 10, SpringLayout.WEST,
contentPane);
layout.putConstraint(SpringLayout.NORTH, left, 25, SpringLayout.NORTH,
contentPane);
layout.putConstraint(SpringLayout.NORTH, right, 25, SpringLayout.NORTH,
contentPane);
layout.putConstraint(SpringLayout.WEST, right, 20, SpringLayout.EAST,
left);
frame.setSize(300, 100);
frame.show();
}
}
Laying Out Components in a Flow (Left-to-Right, Top-to-Bottom)
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Main {
public static void main(String[] argv) throws Exception {
JButton component1 = new JButton();
JButton component2 = new JButton();
int align = FlowLayout.CENTER; // or LEFT, RIGHT
JPanel panel = new JPanel(new FlowLayout(align));
panel.add(component1);
panel.add(component2);
}
}
Laying Out Components in a Grid
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Main {
public static void main(String[] argv) throws Exception {
JButton component1 = new JButton();
JButton component2 = new JButton();
int rows = 2;
int cols = 2;
JPanel panel = new JPanel(new GridLayout(rows, cols));
panel.add(component1);
panel.add(component2);
}
}
Laying Out Components Using Absolute Coordinates
import javax.swing.JButton;
import javax.swing.JPanel;
public class Main {
public static void main(String[] argv) throws Exception {
JButton component = new JButton();
JPanel panel = new JPanel(null);
component.setBounds(1, 1, 100, 100);
panel.add(component);
}
}
Layout: Overlay Sample
/*
Definitive Guide to Swing for Java 2, Second Edition
By John Zukowski
ISBN: 1-893115-78-X
Publisher: APress
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.OverlayLayout;
public class OverlaySample {
public static final String SET_MINIMUM = "Minimum";
public static final String SET_MAXIMUM = "Maximum";
public static final String SET_CENTRAL = "Central";
public static final String SET_MIXED = "Mixed";
static JButton smallButton = new JButton();
static JButton mediumButton = new JButton();
static JButton largeButton = new JButton();
public static void setupButtons(String command) {
if (SET_MINIMUM.equals(command)) {
smallButton.setAlignmentX(0.0f);
smallButton.setAlignmentY(0.0f);
mediumButton.setAlignmentX(0.0f);
mediumButton.setAlignmentY(0.0f);
largeButton.setAlignmentX(0.0f);
largeButton.setAlignmentY(0.0f);
} else if (SET_MAXIMUM.equals(command)) {
smallButton.setAlignmentX(1.0f);
smallButton.setAlignmentY(1.0f);
mediumButton.setAlignmentX(1.0f);
mediumButton.setAlignmentY(1.0f);
largeButton.setAlignmentX(1.0f);
largeButton.setAlignmentY(1.0f);
} else if (SET_CENTRAL.equals(command)) {
smallButton.setAlignmentX(0.5f);
smallButton.setAlignmentY(0.5f);
mediumButton.setAlignmentX(0.5f);
mediumButton.setAlignmentY(0.5f);
largeButton.setAlignmentX(0.5f);
largeButton.setAlignmentY(0.5f);
} else if (SET_MIXED.equals(command)) {
smallButton.setAlignmentX(0.0f);
smallButton.setAlignmentY(0.0f);
mediumButton.setAlignmentX(0.5f);
mediumButton.setAlignmentY(0.5f);
largeButton.setAlignmentX(1.0f);
largeButton.setAlignmentY(1.0f);
} else {
throw new IllegalArgumentException("Illegal Command: " + command);
}
// Redraw panel
((JPanel) largeButton.getParent()).revalidate();
}
public static void main(String args[]) {
ActionListener generalActionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
JComponent comp = (JComponent) actionEvent.getSource();
System.out.println(actionEvent.getActionCommand() + ": "
+ comp.getBounds());
}
};
ActionListener sizingActionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
setupButtons(actionEvent.getActionCommand());
}
};
JFrame frame = new JFrame("Overlay Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
LayoutManager overlay = new OverlayLayout(panel);
panel.setLayout(overlay);
Object settings[][] = {
{ "Small", new Dimension(25, 25), Color.white },
{ "Medium", new Dimension(50, 50), Color.gray },
{ "Large", new Dimension(100, 100), Color.black } };
JButton buttons[] = { smallButton, mediumButton, largeButton };
for (int i = 0, n = settings.length; i < n; i++) {
JButton button = buttons[i];
button.addActionListener(generalActionListener);
button.setActionCommand((String) settings[i][0]);
button.setMaximumSize((Dimension) settings[i][1]);
button.setBackground((Color) settings[i][2]);
panel.add(button);
}
setupButtons(SET_CENTRAL);
JPanel actionPanel = new JPanel();
actionPanel.setBorder(BorderFactory
.createTitledBorder("Change Alignment"));
String actionSettings[] = { SET_MINIMUM, SET_MAXIMUM, SET_CENTRAL,
SET_MIXED };
for (int i = 0, n = actionSettings.length; i < n; i++) {
JButton button = new JButton(actionSettings[i]);
button.addActionListener(sizingActionListener);
actionPanel.add(button);
}
Container contentPane = frame.getContentPane();
contentPane.add(panel, BorderLayout.CENTER);
contentPane.add(actionPanel, BorderLayout.SOUTH);
frame.setSize(400, 300);
frame.setVisible(true);
}
}
NullLayout Pane
/*
* Copyright (c) 2000 David Flanagan. All rights reserved. This code is from the
* book Java Examples in a Nutshell, 2nd Edition. It is provided AS-IS, WITHOUT
* ANY WARRANTY either expressed or implied. You may study, use, and modify it
* for any non-commercial purpose. You may distribute it non-commercially as
* long as you retain this notice. For a commercial use license, or to purchase
* the book (recommended), visit http://www.davidflanagan.ru/javaexamples2.
*/
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class NullLayoutPane extends JPanel {
public NullLayoutPane() {
// Get rid of the default layout manager.
// We"ll arrange the components ourselves.
this.setLayout(null);
// Create some buttons and set their sizes and positions explicitly
for (int i = 1; i <= 9; i++) {
JButton b = new JButton("Button #" + i);
b.setBounds(i * 30, i * 20, 125, 30); // use reshape() in Java 1.0
this.add(b);
}
}
// Specify how big the panel should be.
public Dimension getPreferredSize() {
return new Dimension(425, 250);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(new NullLayoutPane(), BorderLayout.CENTER);
// Finally, set the size of the main window, and pop it up.
frame.setSize(600, 400);
frame.setVisible(true);
}
}
Rigid areas are like pairs of struts
// : c14:Box4.java
// Rigid areas are like pairs of struts.
// <applet code=Box4 width=450 height=300></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Box4 extends JApplet {
public void init() {
Box bv = Box.createVerticalBox();
bv.add(new JButton("Top"));
bv.add(Box.createRigidArea(new Dimension(120, 90)));
bv.add(new JButton("Bottom"));
Box bh = Box.createHorizontalBox();
bh.add(new JButton("Left"));
bh.add(Box.createRigidArea(new Dimension(160, 80)));
bh.add(new JButton("Right"));
bv.add(bh);
getContentPane().add(bv);
}
public static void main(String[] args) {
run(new Box4(), 450, 300);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
Simpler CardLayout demo
/*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.
* All rights reserved. Software written by Ian F. Darwin and others.
* $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS""
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee
* cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s,
* pioneering role in inventing and promulgating (and standardizing) the Java
* language and environment is gratefully acknowledged.
*
* The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
* inventing predecessor languages C and C++ is also gratefully acknowledged.
*/
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Simpler CardLayout demo: cycles through some labels.
*
* @author Ian Darwin
* @version $Id: CardLayDemo1.java,v 1.3 2004/03/21 00:44:36 ian Exp $
*/
public class CardLayDemo1 extends Applet {
CardLayout cardlay;
Panel panel;
Button b1;
int cardno = 0;
final int NCARDS = 4;
String labels[] = new String[NCARDS];
public void init() {
panel = new Panel();
cardlay = new CardLayout();
b1 = new Button("Next");
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (++cardno >= NCARDS)
cardno = 0;
cardlay.show(panel, labels[cardno]);
}
});
labels[0] = "Card One";
labels[1] = "Card Two";
labels[2] = "Card Three";
labels[3] = "Card Four";
panel.setLayout(cardlay);
for (int i = 0; i < NCARDS; i++)
panel.add(labels[i], new Label(labels[i]));
cardlay.show(panel, labels[0]);
setLayout(new BorderLayout());
add("Center", panel);
add("South", b1);
}
}
Spring Compact Grid
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
/*
* A 1.4 application that uses SpringLayout to create a compact grid. Other
* files required: SpringUtilities.java.
*/
import java.awt.ruponent;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Spring;
import javax.swing.SpringLayout;
public class SpringCompactGrid {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
JPanel panel = new JPanel(new SpringLayout());
int rows = 10;
int cols = 10;
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
int anInt = (int) Math.pow(r, c);
JTextField textField = new JTextField(Integer.toString(anInt));
panel.add(textField);
}
}
//Lay out the panel.
SpringUtilities.makeCompactGrid(panel, //parent
rows, cols, 3, 3, //initX, initY
3, 3); //xPad, yPad
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringCompactGrid");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
panel.setOpaque(true); //content panes must be opaque
frame.setContentPane(panel);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/**
* A 1.4 file that provides utility methods for creating form- or grid-style
* layouts with SpringLayout. These utilities are used by several programs, such
* as SpringBox and SpringCompactGrid.
*/
class SpringUtilities {
/**
* A debugging utility that prints to stdout the component"s minimum,
* preferred, and maximum sizes.
*/
public static void printSizes(Component c) {
System.out.println("minimumSize = " + c.getMinimumSize());
System.out.println("preferredSize = " + c.getPreferredSize());
System.out.println("maximumSize = " + c.getMaximumSize());
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component is as big as the maximum
* preferred width and height of the components. The parent is made just big
* enough to fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeGrid must use SpringLayout.");
return;
}
Spring xPadSpring = Spring.constant(xPad);
Spring yPadSpring = Spring.constant(yPad);
Spring initialXSpring = Spring.constant(initialX);
Spring initialYSpring = Spring.constant(initialY);
int max = rows * cols;
//Calculate Springs that are the max of the width/height so that all
//cells have the same size.
Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
for (int i = 1; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
}
//Apply the new width/height Spring. This forces all the
//components to have the same size.
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
cons.setWidth(maxWidthSpring);
cons.setHeight(maxHeightSpring);
}
//Then adjust the x/y constraints of all the cells so that they
//are aligned in a grid.
SpringLayout.Constraints lastCons = null;
SpringLayout.Constraints lastRowCons = null;
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
if (i % cols == 0) { //start of new row
lastRowCons = lastCons;
cons.setX(initialXSpring);
} else { //x position depends on previous component
cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST),
xPadSpring));
}
if (i / cols == 0) { //first row
cons.setY(initialYSpring);
} else { //y position depends on previous row
cons.setY(Spring.sum(lastRowCons
.getConstraint(SpringLayout.SOUTH), yPadSpring));
}
lastCons = cons;
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(Spring
.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
pCons.setConstraint(SpringLayout.EAST, Spring.sum(
Spring.constant(xPad), lastCons
.getConstraint(SpringLayout.EAST)));
}
/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell(int row,
int col, Container parent, int cols) {
SpringLayout layout = (SpringLayout) parent.getLayout();
Component c = parent.getComponent(row * cols + col);
return layout.getConstraints(c);
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component in a column is as wide as
* the maximum preferred width of the components in that column; height is
* similarly determined for each row. The parent is made just big enough to
* fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeCompactGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeCompactGrid must use SpringLayout.");
return;
}
//Align all cells in each column and make them the same width.
Spring x = Spring.constant(initialX);
for (int c = 0; c < cols; c++) {
Spring width = Spring.constant(0);
for (int r = 0; r < rows; r++) {
width = Spring.max(width, getConstraintsForCell(r, c, parent,
cols).getWidth());
}
for (int r = 0; r < rows; r++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setX(x);
constraints.setWidth(width);
}
x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
}
//Align all cells in each row and make them the same height.
Spring y = Spring.constant(initialY);
for (int r = 0; r < rows; r++) {
Spring height = Spring.constant(0);
for (int c = 0; c < cols; c++) {
height = Spring.max(height, getConstraintsForCell(r, c, parent,
cols).getHeight());
}
for (int c = 0; c < cols; c++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setY(y);
constraints.setHeight(height);
}
y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, y);
pCons.setConstraint(SpringLayout.EAST, x);
}
}
Spring Demo 1
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
public class SpringDemo1 {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringDemo1");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
contentPane.add(new JLabel("Label: "));
contentPane.add(new JTextField("Text field", 15));
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Spring Demo 2
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
public class SpringDemo2 {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringDemo2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
//Create and add the components.
JLabel label = new JLabel("Label: ");
JTextField textField = new JTextField("Text field", 15);
contentPane.add(label);
contentPane.add(textField);
//Adjust constraints for the label so it"s at (5,5).
layout.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST,
contentPane);
layout.putConstraint(SpringLayout.NORTH, label, 5, SpringLayout.NORTH,
contentPane);
//Adjust constraints for the text field so it"s at
//(<label"s right edge> + 5, 5).
layout.putConstraint(SpringLayout.WEST, textField, 5,
SpringLayout.EAST, label);
layout.putConstraint(SpringLayout.NORTH, textField, 5,
SpringLayout.NORTH, contentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Spring Demo 3
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
public class SpringDemo3 {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringDemo3");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
//Create and add the components.
JLabel label = new JLabel("Label: ");
JTextField textField = new JTextField("Text field", 15);
contentPane.add(label);
contentPane.add(textField);
//Adjust constraints for the label so it"s at (5,5).
layout.putConstraint(SpringLayout.WEST, label, 5, SpringLayout.WEST,
contentPane);
layout.putConstraint(SpringLayout.NORTH, label, 5, SpringLayout.NORTH,
contentPane);
//Adjust constraints for the text field so it"s at
//(<label"s right edge> + 5, 5).
layout.putConstraint(SpringLayout.WEST, textField, 5,
SpringLayout.EAST, label);
layout.putConstraint(SpringLayout.NORTH, textField, 5,
SpringLayout.NORTH, contentPane);
//Adjust constraints for the content pane: Its right
//edge should be 5 pixels beyond the text field"s right
//edge, and its bottom edge should be 5 pixels beyond
//the bottom edge of the tallest component (which we"ll
//assume is textField).
layout.putConstraint(SpringLayout.EAST, contentPane, 5,
SpringLayout.EAST, textField);
layout.putConstraint(SpringLayout.SOUTH, contentPane, 5,
SpringLayout.SOUTH, textField);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Spring Demo 4
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
import java.awt.ruponent;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.Spring;
import javax.swing.SpringLayout;
public class SpringDemo4 {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringDemo4");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
Container contentPane = frame.getContentPane();
SpringLayout layout = new SpringLayout();
contentPane.setLayout(layout);
//Create and add the components.
JLabel label = new JLabel("Label: ");
JTextField textField = new JTextField("Text field", 15);
contentPane.add(label);
contentPane.add(textField);
//Adjust constraints for the label so it"s at (5,5).
SpringLayout.Constraints labelCons = layout.getConstraints(label);
labelCons.setX(Spring.constant(5));
labelCons.setY(Spring.constant(5));
//Adjust constraints for the text field so it"s at
//(<label"s right edge> + 5, 5).
SpringLayout.Constraints textFieldCons = layout
.getConstraints(textField);
textFieldCons.setX(Spring.sum(Spring.constant(5), labelCons
.getConstraint(SpringLayout.EAST)));
textFieldCons.setY(Spring.constant(5));
//Adjust constraints for the content pane.
setContainerSize(contentPane, 5);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public static void setContainerSize(Container parent, int pad) {
SpringLayout layout = (SpringLayout) parent.getLayout();
Component[] components = parent.getComponents();
Spring maxHeightSpring = Spring.constant(0);
SpringLayout.Constraints pCons = layout.getConstraints(parent);
//Set the container"s right edge to the right edge
//of its rightmost component + padding.
Component rightmost = components[components.length - 1];
SpringLayout.Constraints rCons = layout.getConstraints(rightmost);
pCons.setConstraint(SpringLayout.EAST, Spring.sum(Spring.constant(pad),
rCons.getConstraint(SpringLayout.EAST)));
//Set the container"s bottom edge to the bottom edge
//of its tallest component + padding.
for (int i = 0; i < components.length; i++) {
SpringLayout.Constraints cons = layout
.getConstraints(components[i]);
maxHeightSpring = Spring.max(maxHeightSpring, cons
.getConstraint(SpringLayout.SOUTH));
}
pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(
Spring.constant(pad), maxHeightSpring));
}
}
Spring Form
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
/*
* A 1.4 application that uses SpringLayout to create a forms-type layout. Other
* files required: SpringUtilities.java.
*/
import java.awt.ruponent;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Spring;
import javax.swing.SpringLayout;
public class SpringForm {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
String[] labels = { "Name: ", "Fax: ", "Email: ", "Address: " };
int numPairs = labels.length;
//Create and populate the panel.
JPanel p = new JPanel(new SpringLayout());
for (int i = 0; i < numPairs; i++) {
JLabel l = new JLabel(labels[i], JLabel.TRAILING);
p.add(l);
JTextField textField = new JTextField(10);
l.setLabelFor(textField);
p.add(textField);
}
//Lay out the panel.
SpringUtilities.makeCompactGrid(p, numPairs, 2, //rows, cols
6, 6, //initX, initY
6, 6); //xPad, yPad
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringForm");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
p.setOpaque(true); //content panes must be opaque
frame.setContentPane(p);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/**
* A 1.4 file that provides utility methods for creating form- or grid-style
* layouts with SpringLayout. These utilities are used by several programs, such
* as SpringBox and SpringCompactGrid.
*/
class SpringUtilities {
/**
* A debugging utility that prints to stdout the component"s minimum,
* preferred, and maximum sizes.
*/
public static void printSizes(Component c) {
System.out.println("minimumSize = " + c.getMinimumSize());
System.out.println("preferredSize = " + c.getPreferredSize());
System.out.println("maximumSize = " + c.getMaximumSize());
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component is as big as the maximum
* preferred width and height of the components. The parent is made just big
* enough to fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeGrid must use SpringLayout.");
return;
}
Spring xPadSpring = Spring.constant(xPad);
Spring yPadSpring = Spring.constant(yPad);
Spring initialXSpring = Spring.constant(initialX);
Spring initialYSpring = Spring.constant(initialY);
int max = rows * cols;
//Calculate Springs that are the max of the width/height so that all
//cells have the same size.
Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
for (int i = 1; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
}
//Apply the new width/height Spring. This forces all the
//components to have the same size.
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
cons.setWidth(maxWidthSpring);
cons.setHeight(maxHeightSpring);
}
//Then adjust the x/y constraints of all the cells so that they
//are aligned in a grid.
SpringLayout.Constraints lastCons = null;
SpringLayout.Constraints lastRowCons = null;
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
if (i % cols == 0) { //start of new row
lastRowCons = lastCons;
cons.setX(initialXSpring);
} else { //x position depends on previous component
cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST),
xPadSpring));
}
if (i / cols == 0) { //first row
cons.setY(initialYSpring);
} else { //y position depends on previous row
cons.setY(Spring.sum(lastRowCons
.getConstraint(SpringLayout.SOUTH), yPadSpring));
}
lastCons = cons;
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(Spring
.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
pCons.setConstraint(SpringLayout.EAST, Spring.sum(
Spring.constant(xPad), lastCons
.getConstraint(SpringLayout.EAST)));
}
/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell(int row,
int col, Container parent, int cols) {
SpringLayout layout = (SpringLayout) parent.getLayout();
Component c = parent.getComponent(row * cols + col);
return layout.getConstraints(c);
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component in a column is as wide as
* the maximum preferred width of the components in that column; height is
* similarly determined for each row. The parent is made just big enough to
* fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeCompactGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeCompactGrid must use SpringLayout.");
return;
}
//Align all cells in each column and make them the same width.
Spring x = Spring.constant(initialX);
for (int c = 0; c < cols; c++) {
Spring width = Spring.constant(0);
for (int r = 0; r < rows; r++) {
width = Spring.max(width, getConstraintsForCell(r, c, parent,
cols).getWidth());
}
for (int r = 0; r < rows; r++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setX(x);
constraints.setWidth(width);
}
x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
}
//Align all cells in each row and make them the same height.
Spring y = Spring.constant(initialY);
for (int r = 0; r < rows; r++) {
Spring height = Spring.constant(0);
for (int c = 0; c < cols; c++) {
height = Spring.max(height, getConstraintsForCell(r, c, parent,
cols).getHeight());
}
for (int c = 0; c < cols; c++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setY(y);
constraints.setHeight(height);
}
y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, y);
pCons.setConstraint(SpringLayout.EAST, x);
}
}
SpringLayout Utilities
/*
* (c) Copyright 2004 by Heng Yuan
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* ITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
import java.awt.*;
import javax.swing.*;
/**
* This code is from
* The source is at http://java.sun.ru/docs/books/tutorial/uiswing/layout/example-1dot4/SpringUtilities.java.
* No copyright or license information was in the source file and it was from the tutorial. Thus
* assuming I could use it in this program. Below is the original file header. The file is
* not modified other than reformating white spaces.
* <p>
* A 1.4 file that provides utility methods for
* creating form- or grid-style layouts with SpringLayout.
* These utilities are used by several programs, such as
* SpringBox and SpringCompactGrid.
* </p>
* TODO: Although algorithm wise is correct, this class fails to address the problem of rounding
* errors. As the result, sometimes the last row can be mismatched with other rows. The solution
* to the problem is to force the alignment of edges.
*
* @see javax.swing.SpringLayout
* @see cookxml.cookswing.creator.SpringGridCreator
* @author Heng Yuan
* @version $Id: SpringLayoutUtilities.java 215 2007-06-06 03:59:41Z coconut $
* @since CookSwing 1.0
*/
public class SpringLayoutUtilities
{
/**
* A debugging utility that prints to stdout the component"s
* minimum, preferred, and maximum sizes.
*/
public static void printSizes (Component c)
{
System.out.println ("minimumSize = " + c.getMinimumSize ());
System.out.println ("preferredSize = " + c.getPreferredSize ());
System.out.println ("maximumSize = " + c.getMaximumSize ());
}
/**
* Aligns the first <code>rows</code> * <code>cols</code>
* components of <code>parent</code> in
* a grid. Each component is as big as the maximum
* preferred width and height of the components.
* The parent is made just big enough to fit them all.
*
* @param rows number of rows
* @param cols number of columns
* @param initialX x location to start the grid at
* @param initialY y location to start the grid at
* @param xPad x padding between cells
* @param yPad y padding between cells
*/
public static void makeGrid (Container parent,
int rows, int cols,
int initialX, int initialY,
int xPad, int yPad)
{
SpringLayout layout;
try
{
layout = (SpringLayout)parent.getLayout ();
}
catch (ClassCastException exc)
{
System.err.println ("The first argument to makeGrid must use SpringLayout.");
return;
}
Spring xPadSpring = Spring.constant (xPad);
Spring yPadSpring = Spring.constant (yPad);
Spring initialXSpring = Spring.constant (initialX);
Spring initialYSpring = Spring.constant (initialY);
int max = rows * cols;
//Calculate Springs that are the max of the width/height so that all
//cells have the same size.
Spring maxWidthSpring = layout.getConstraints (parent.getComponent (0)).
getWidth ();
Spring maxHeightSpring = layout.getConstraints (parent.getComponent (0)).
getWidth ();
for (int i = 1; i < max; i++)
{
SpringLayout.Constraints cons = layout.getConstraints (parent.getComponent (i));
maxWidthSpring = Spring.max (maxWidthSpring, cons.getWidth ());
maxHeightSpring = Spring.max (maxHeightSpring, cons.getHeight ());
}
//Apply the new width/height Spring. This forces all the
//components to have the same size.
for (int i = 0; i < max; i++)
{
SpringLayout.Constraints cons = layout.getConstraints (parent.getComponent (i));
cons.setWidth (maxWidthSpring);
cons.setHeight (maxHeightSpring);
}
//Then adjust the x/y constraints of all the cells so that they
//are aligned in a grid.
SpringLayout.Constraints lastCons = null;
SpringLayout.Constraints lastRowCons = null;
for (int i = 0; i < max; i++)
{
SpringLayout.Constraints cons = layout.getConstraints (parent.getComponent (i));
if (i % cols == 0)
{ //start of new row
lastRowCons = lastCons;
cons.setX (initialXSpring);
}
else
{ //x position depends on previous component
cons.setX (Spring.sum (lastCons.getConstraint (SpringLayout.EAST),
xPadSpring));
}
if (i / cols == 0)
{ //first row
cons.setY (initialYSpring);
}
else
{ //y position depends on previous row
cons.setY (Spring.sum (lastRowCons.getConstraint (SpringLayout.SOUTH),
yPadSpring));
}
lastCons = cons;
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints (parent);
pCons.setConstraint (SpringLayout.SOUTH,
Spring.sum (Spring.constant (yPad),
lastCons.getConstraint (SpringLayout.SOUTH)));
pCons.setConstraint (SpringLayout.EAST,
Spring.sum (Spring.constant (xPad),
lastCons.getConstraint (SpringLayout.EAST)));
}
/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell (int row, int col,
Container parent,
int cols)
{
SpringLayout layout = (SpringLayout)parent.getLayout ();
Component c = parent.getComponent (row * cols + col);
return layout.getConstraints (c);
}
/**
* Aligns the first <code>rows</code> * <code>cols</code>
* components of <code>parent</code> in
* a grid. Each component in a column is as wide as the maximum
* preferred width of the components in that column;
* height is similarly determined for each row.
* The parent is made just big enough to fit them all.
*
* @param rows number of rows
* @param cols number of columns
* @param initialX x location to start the grid at
* @param initialY y location to start the grid at
* @param xPad x padding between cells
* @param yPad y padding between cells
*/
public static void makeCompactGrid (Container parent,
int rows, int cols,
int initialX, int initialY,
int xPad, int yPad)
{
SpringLayout layout;
try
{
layout = (SpringLayout)parent.getLayout ();
}
catch (ClassCastException exc)
{
System.err.println ("The first argument to makeCompactGrid must use SpringLayout.");
return;
}
//Align all cells in each column and make them the same width.
Spring x = Spring.constant (initialX);
for (int c = 0; c < cols; c++)
{
Spring width = Spring.constant (0);
for (int r = 0; r < rows; r++)
{
width = Spring.max (width,
getConstraintsForCell (r, c, parent, cols).
getWidth ());
}
for (int r = 0; r < rows; r++)
{
SpringLayout.Constraints constraints =
getConstraintsForCell (r, c, parent, cols);
constraints.setX (x);
constraints.setWidth (width);
}
x = Spring.sum (x, Spring.sum (width, Spring.constant (xPad)));
}
//Align all cells in each row and make them the same height.
Spring y = Spring.constant (initialY);
for (int r = 0; r < rows; r++)
{
Spring height = Spring.constant (0);
for (int c = 0; c < cols; c++)
{
height = Spring.max (height,
getConstraintsForCell (r, c, parent, cols).
getHeight ());
}
for (int c = 0; c < cols; c++)
{
SpringLayout.Constraints constraints =
getConstraintsForCell (r, c, parent, cols);
constraints.setY (y);
constraints.setHeight (height);
}
y = Spring.sum (y, Spring.sum (height, Spring.constant (yPad)));
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints (parent);
pCons.setConstraint (SpringLayout.SOUTH, y);
pCons.setConstraint (SpringLayout.EAST, x);
}
}
Use FlowLayout to hold checkBox, Label and TextField
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.List;
import java.awt.TextField;
public class Main {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout demo");
f.setLayout(new FlowLayout());
f.add(new Button("Red"));
f.add(new Button("Blue"));
f.add(new Button("White"));
List list = new List();
for (int i = 0; i < args.length; i++) {
list.add(args[i]);
}
f.add(list);
f.add(new Checkbox("Pick me", true));
f.add(new Label("Enter name here:"));
f.add(new TextField(20));
f.pack();
f.setVisible(true);
}
}
Use SpringLayout to create a single row of components
/* From http://java.sun.ru/docs/books/tutorial/index.html */
/*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* -Redistribution of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or intended
* for use in the design, construction, operation or maintenance of any
* nuclear facility.
*/
/*
* A 1.4 application that uses SpringLayout to create a single row of
* components, similar to that produced by a horizontal BoxLayout. Other files
* required: SpringUtilities.java.
*/
import java.awt.ruponent;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Spring;
import javax.swing.SpringLayout;
public class SpringBox {
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
JFrame frame = new JFrame("SpringBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
Container contentPane = frame.getContentPane();
contentPane.setLayout(new SpringLayout());
//Add the buttons.
contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("Button 2"));
contentPane.add(new JButton("Button 3"));
contentPane.add(new JButton("Long-Named Button 4"));
contentPane.add(new JButton("5"));
//Lay out the buttons in one row and as many columns
//as necessary, with 6 pixels of padding all around.
SpringUtilities.makeCompactGrid(contentPane, 1, contentPane
.getComponentCount(), 6, 6, 6, 6);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/**
* A 1.4 file that provides utility methods for creating form- or grid-style
* layouts with SpringLayout. These utilities are used by several programs, such
* as SpringBox and SpringCompactGrid.
*/
class SpringUtilities {
/**
* A debugging utility that prints to stdout the component"s minimum,
* preferred, and maximum sizes.
*/
public static void printSizes(Component c) {
System.out.println("minimumSize = " + c.getMinimumSize());
System.out.println("preferredSize = " + c.getPreferredSize());
System.out.println("maximumSize = " + c.getMaximumSize());
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component is as big as the maximum
* preferred width and height of the components. The parent is made just big
* enough to fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeGrid must use SpringLayout.");
return;
}
Spring xPadSpring = Spring.constant(xPad);
Spring yPadSpring = Spring.constant(yPad);
Spring initialXSpring = Spring.constant(initialX);
Spring initialYSpring = Spring.constant(initialY);
int max = rows * cols;
//Calculate Springs that are the max of the width/height so that all
//cells have the same size.
Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0))
.getWidth();
for (int i = 1; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
}
//Apply the new width/height Spring. This forces all the
//components to have the same size.
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
cons.setWidth(maxWidthSpring);
cons.setHeight(maxHeightSpring);
}
//Then adjust the x/y constraints of all the cells so that they
//are aligned in a grid.
SpringLayout.Constraints lastCons = null;
SpringLayout.Constraints lastRowCons = null;
for (int i = 0; i < max; i++) {
SpringLayout.Constraints cons = layout.getConstraints(parent
.getComponent(i));
if (i % cols == 0) { //start of new row
lastRowCons = lastCons;
cons.setX(initialXSpring);
} else { //x position depends on previous component
cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST),
xPadSpring));
}
if (i / cols == 0) { //first row
cons.setY(initialYSpring);
} else { //y position depends on previous row
cons.setY(Spring.sum(lastRowCons
.getConstraint(SpringLayout.SOUTH), yPadSpring));
}
lastCons = cons;
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, Spring.sum(Spring
.constant(yPad), lastCons.getConstraint(SpringLayout.SOUTH)));
pCons.setConstraint(SpringLayout.EAST, Spring.sum(
Spring.constant(xPad), lastCons
.getConstraint(SpringLayout.EAST)));
}
/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell(int row,
int col, Container parent, int cols) {
SpringLayout layout = (SpringLayout) parent.getLayout();
Component c = parent.getComponent(row * cols + col);
return layout.getConstraints(c);
}
/**
* Aligns the first <code>rows</code>*<code>cols</code> components of
* <code>parent</code> in a grid. Each component in a column is as wide as
* the maximum preferred width of the components in that column; height is
* similarly determined for each row. The parent is made just big enough to
* fit them all.
*
* @param rows
* number of rows
* @param cols
* number of columns
* @param initialX
* x location to start the grid at
* @param initialY
* y location to start the grid at
* @param xPad
* x padding between cells
* @param yPad
* y padding between cells
*/
public static void makeCompactGrid(Container parent, int rows, int cols,
int initialX, int initialY, int xPad, int yPad) {
SpringLayout layout;
try {
layout = (SpringLayout) parent.getLayout();
} catch (ClassCastException exc) {
System.err
.println("The first argument to makeCompactGrid must use SpringLayout.");
return;
}
//Align all cells in each column and make them the same width.
Spring x = Spring.constant(initialX);
for (int c = 0; c < cols; c++) {
Spring width = Spring.constant(0);
for (int r = 0; r < rows; r++) {
width = Spring.max(width, getConstraintsForCell(r, c, parent,
cols).getWidth());
}
for (int r = 0; r < rows; r++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setX(x);
constraints.setWidth(width);
}
x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
}
//Align all cells in each row and make them the same height.
Spring y = Spring.constant(initialY);
for (int r = 0; r < rows; r++) {
Spring height = Spring.constant(0);
for (int c = 0; c < cols; c++) {
height = Spring.max(height, getConstraintsForCell(r, c, parent,
cols).getHeight());
}
for (int c = 0; c < cols; c++) {
SpringLayout.Constraints constraints = getConstraintsForCell(r,
c, parent, cols);
constraints.setY(y);
constraints.setHeight(height);
}
y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
}
//Set the parent"s size.
SpringLayout.Constraints pCons = layout.getConstraints(parent);
pCons.setConstraint(SpringLayout.SOUTH, y);
pCons.setConstraint(SpringLayout.EAST, x);
}
}
Using CardLayout
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
class CardFrame extends JFrame implements ActionListener {
JButton nextCard = new JButton("Next Card >");
JButton prevCard = new JButton("< Previous Card");
JButton firstCard = new JButton("<< First Card");
JButton lastCard = new JButton("Last Card >>");
JPanel cardPanel = new JPanel();
CardLayout cardLayout = new CardLayout(10, 10);
public CardFrame(String title) {
setLayout(new BorderLayout(10, 10));
nextCard.addActionListener(this);
prevCard.addActionListener(this);
firstCard.addActionListener(this);
lastCard.addActionListener(this);
Panel buttonsPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
buttonsPanel.add(firstCard);
buttonsPanel.add(prevCard);
buttonsPanel.add(nextCard);
buttonsPanel.add(lastCard);
setCardLayout();
add(BorderLayout.CENTER, cardPanel);
add(BorderLayout.NORTH, buttonsPanel);
}
private void setCardLayout() {
cardPanel.setLayout(cardLayout);
Label one = new Label("CARD 1", Label.CENTER);
Label two = new Label("CARD 2", Label.CENTER);
Label three = new Label("CARD 3", Label.CENTER);
Label four = new Label("CARD 4", Label.CENTER);
Label five = new Label("CARD 5", Label.CENTER);
cardPanel.add(one, "one");
cardPanel.add(two, "two");
cardPanel.add(three, "three");
cardPanel.add(four, "four");
cardPanel.add(five, "five");
cardLayout.show(cardPanel, "one");
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource().equals(nextCard)) {
cardLayout.next(cardPanel);
} else if (ae.getSource().equals(prevCard)) {
cardLayout.previous(cardPanel);
} else if (ae.getSource().equals(lastCard)) {
cardLayout.last(cardPanel);
} else if (ae.getSource().equals(firstCard)) {
cardLayout.first(cardPanel);
}
}
}
Using Glue
// : c14:Box3.java
// Using Glue.
// <applet code=Box3 width=450 height=300></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import javax.swing.Box;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Box3 extends JApplet {
public void init() {
Box bv = Box.createVerticalBox();
bv.add(new JLabel("Hello"));
bv.add(Box.createVerticalGlue());
bv.add(new JLabel("Applet"));
bv.add(Box.createVerticalGlue());
bv.add(new JLabel("World"));
Box bh = Box.createHorizontalBox();
bh.add(new JLabel("Hello"));
bh.add(Box.createHorizontalGlue());
bh.add(new JLabel("Applet"));
bh.add(Box.createHorizontalGlue());
bh.add(new JLabel("World"));
bv.add(Box.createVerticalGlue());
bv.add(bh);
bv.add(Box.createVerticalGlue());
getContentPane().add(bv);
}
public static void main(String[] args) {
run(new Box3(), 450, 300);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
Various layouts
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
public class CommonLayouts extends JFrame {
public CommonLayouts() {
super("Common Layout Managers");
setSize(500, 380);
JPanel desktop = new JPanel();
getContentPane().add(desktop);
JPanel fr1 = new JPanel();
fr1.setBorder(new TitledBorder("FlowLayout"));
fr1.setLayout(new FlowLayout());
fr1.add(new JButton("1"));
fr1.add(new JButton("2"));
fr1.add(new JButton("3"));
fr1.add(new JButton("4"));
desktop.add(fr1, 0);
JPanel fr2 = new JPanel();
fr2.setBorder(new TitledBorder("GridLayout"));
fr2.setLayout(new GridLayout(2, 2));
fr2.add(new JButton("1"));
fr2.add(new JButton("2"));
fr2.add(new JButton("3"));
fr2.add(new JButton("4"));
desktop.add(fr2, 0);
JPanel fr3 = new JPanel();
fr3.setBorder(new TitledBorder("BorderLayout"));
fr3.add(new JButton("1"), BorderLayout.NORTH);
fr3.add(new JButton("2"), BorderLayout.EAST);
fr3.add(new JButton("3"), BorderLayout.SOUTH);
fr3.add(new JButton("4"), BorderLayout.WEST);
desktop.add(fr3, 0);
JPanel fr4 = new JPanel();
fr4.setBorder(new TitledBorder("BoxLayout - X"));
fr4.setLayout(new BoxLayout(fr4, BoxLayout.X_AXIS));
fr4.add(new JButton("1"));
fr4.add(Box.createHorizontalStrut(12));
fr4.add(new JButton("2"));
fr4.add(Box.createGlue());
fr4.add(new JButton("3"));
fr4.add(Box.createHorizontalGlue());
fr4.add(new JButton("4"));
desktop.add(fr4, 0);
JPanel fr5 = new JPanel();
fr5.setBorder(new TitledBorder("BoxLayout - Y"));
fr5.setLayout(new BoxLayout(fr5, BoxLayout.Y_AXIS));
fr5.add(new JButton("1"));
fr5.add(Box.createVerticalStrut(10));
fr5.add(new JButton("2"));
fr5.add(Box.createGlue());
fr5.add(new JButton("3"));
fr5.add(Box.createVerticalGlue());
fr5.add(new JButton("4"));
desktop.add(fr5, 0);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
addWindowListener(wndCloser);
setVisible(true);
}
public static void main(String argv[]) {
new CommonLayouts();
}
}
Vertical and horizontal BoxLayouts
// : c14:Box1.java
// Vertical and horizontal BoxLayouts.
// <applet code=Box1 width=450 height=200></applet>
// From "Thinking in Java, 3rd ed." (c) Bruce Eckel 2002
// www.BruceEckel.ru. See copyright notice in CopyRight.txt.
import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.Box;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Box1 extends JApplet {
public void init() {
Box bv = Box.createVerticalBox();
for (int i = 0; i < 5; i++)
bv.add(new JButton("bv " + i));
Box bh = Box.createHorizontalBox();
for (int i = 0; i < 5; i++)
bh.add(new JButton("bh " + i));
Container cp = getContentPane();
cp.add(BorderLayout.EAST, bv);
cp.add(BorderLayout.SOUTH, bh);
}
public static void main(String[] args) {
run(new Box1(), 450, 200);
}
public static void run(JApplet applet, int width, int height) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(applet);
frame.setSize(width, height);
applet.init();
applet.start();
frame.setVisible(true);
}
} ///:~
Without layout manager, we position components using absolute values.
import javax.swing.JButton;
import javax.swing.JFrame;
public class Absolute {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setLayout(null);
JButton ok = new JButton("OK");
ok.setBounds(50, 150, 80, 25);
JButton close = new JButton("Close");
close.setBounds(150, 150, 80, 25);
f.add(ok);
f.add(close);
f.setSize(300, 250);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}