FileDocCategorySizeDatePackage
EntryLayout.javaAPI DocExample5697Mon May 31 22:51:38 BST 2004com.darwinsys.swingui.layout

EntryLayout

public class EntryLayout extends Object implements LayoutManager
A simple layout manager, for "Entry" areas ith e.g., a list of labels and their corresponding JTextFields. These typically look like:
Login: _______________
Password: _______________
Basically two (or more) columns of different, but constant, widths. Note: all columns must be the same height!.

Construct instances by passing an array of the column width percentages (as doubles, fractions from 0.1 to 0.9, so 40%,60% would be {0.4, 0.6}). The length of this array uniquely determines the number of columns. Columns are forced to be the relevant widths. Note: As with GridLayout, the number of items added must be an even multiple of the number of columns. If not, exceptions may be thrown!

author
Ian F. Darwin, http://www.darwinsys.com/
version
$Id: EntryLayout.java,v 1.11 2004/06/01 02:51:37 ian Exp $

Fields Summary
protected final double[]
widthPercentages
The array of widths, as decimal fractions (0.4 == 40%, etc.).
protected final int
COLUMNS
The number of columns.
protected static final int
HPAD
The default padding
protected static final int
VPAD
protected final int
hpad
The actual padding
protected final int
vpad
protected boolean
validWidths
True if the list of widths was valid.
int[]
widths
The width of each column, as found by computLayoutSize().
int[]
heights
The height of each row, as found by computLayoutSize().
Constructors Summary
public EntryLayout(double[] relWidths, int h, int v)
Construct an EntryLayout with widths and padding specified.

param
relWidths Array of doubles specifying relative column widths.
param
h Horizontal padding between items
param
v Vertical padding between items


	          	        			     			   	 
	       
		COLUMNS = relWidths.length;
		widthPercentages = new double[COLUMNS];
		for (int i=0; i<relWidths.length; i++) {
			if (relWidths[i] >= 1.0)
				throw new IllegalArgumentException(
					"EntryLayout: widths must be fractions < 1");
			widthPercentages[i] = relWidths[i];
		}
		validWidths = true;
		hpad = h;
		vpad = v;
	
public EntryLayout(double[] relWidths)
Construct an EntryLayout with widths and with default padding amounts.

param
relWidths Array of doubles specifying column widths.

		this(relWidths, HPAD, VPAD);
	
Methods Summary
public voidaddLayoutComponent(java.lang.String name, java.awt.Component comp)
Adds the specified component with the specified constraint to the layout; required by LayoutManager but not used.

		// nothing to do
	
protected java.awt.DimensioncomputeLayoutSize(java.awt.Container parent, int hp, int vp)
Compute the size of the whole mess. Serves as the guts of preferredLayoutSize() and minimumLayoutSize().

param
parent The container in which to do the layout.
param
hp The horizontal padding (may be zero)
param
vp The Vertical Padding (may be zero).

		if (!validWidths)
			return null;
		Component[] components = parent.getComponents();
		Dimension contSize = parent.getSize();
		int preferredWidth = 0, preferredHeight = 0;
		widths = new int[COLUMNS];
		heights = new int[components.length / COLUMNS];
		// System.out.println("Grid: " + widths.length + ", " + heights.length);

		int i;
		// Pass One: Compute largest widths and heights.
		for (i=0; i<components.length; i++) {
			int row = i / widthPercentages.length;
			int col = i % widthPercentages.length;
			Component c = components[i];
			Dimension d = c.getPreferredSize();
			widths[col] = Math.max(widths[col], d.width);
			heights[row] = Math.max(heights[row], d.height);
		}

		// Pass two: agregate them.
		for (i=0; i<widths.length; i++)
			preferredWidth += widths[i] + hp;
		for (i=0; i<heights.length; i++)
			preferredHeight += heights[i] + vp;

		// Finally, pass the sums back as the actual size.
		return new Dimension(preferredWidth, preferredHeight);
	
public voidlayoutContainer(java.awt.Container parent)
Lays out the container in the specified panel. This is a row-column type layout; find x, y, width and height of each Component.

param
parent The Container whose children we are laying out.

		Debug.println("layout","layoutContainer:");
		if (!validWidths)
			return;
		Component[] components = parent.getComponents();
		Dimension contSize = parent.getSize();
		int x = 0;
		for (int i=0; i<components.length; i++) {
			int row = i / COLUMNS;
			int col = i % COLUMNS;
			Component c = components[i];
			Dimension d = c.getPreferredSize();
			int colWidth = (int)(contSize.width * widthPercentages[col]);
			
			if (col == 0) {
				x = hpad;
			} else {
				x += hpad * (col-1) + (int)(contSize.width * widthPercentages[col-1]);
			}
			int y = vpad * (row) + (row * heights[row]) + (heights[row]-d.height);
			Rectangle r = new Rectangle(x, y, colWidth, d.height);
			c.setBounds(r);
		}
	
public java.awt.DimensionminimumLayoutSize(java.awt.Container parent)
Find the minimum Dimension for the specified container given the components therein.

		// System.out.println("minimumLayoutSize");
		return computeLayoutSize(parent, 0, 0);
	
public java.awt.DimensionpreferredLayoutSize(java.awt.Container parent)
Calculates the preferred size dimensions for the specified panel given the components in the specified parent container.

		// System.out.println("preferredLayoutSize");
		return computeLayoutSize(parent, hpad, vpad);
	
public voidremoveLayoutComponent(java.awt.Component comp)
Removes the specified component from the layout; required by LayoutManager, but does nothing.

		// nothing to do