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