Java/Swing Components/FormLayout — различия между версиями

Материал из Java эксперт
Перейти к: навигация, поиск
 
м (1 версия)
 
(нет различий)

Текущая версия на 06:57, 1 июня 2010

Содержание

Build a panel with a leading indent column using the DefaultFormBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how to efficiently build a panel with a leading
 * indent column using the DefaultFormBuilder.<p>
 * 
 * The default FocusTraversalPolicy will lead to a poor focus traversal, 
 * where non-editable fields are included in the focus cycle. 
 * Anyway, this tutorial is about layout, not focus, and so I favor
 * a lean example over a fully functional.  
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 * 
 * @see     DefaultFormBuilder
 */
public class IndentColumnExample {
    
    private JTextField fileNumberField;
    private JTextField rfqNumberField;
    private JTextField blNumberField;
    private JTextField mblNumberField;
    
    private JTextField customerKeyField;
    private JTextField customerAddressField;
    private JTextField shipperKeyField;
    private JTextField shipperAddressField;
    private JTextField consigneeKeyField;
    private JTextField consigneeAddressField;
    
    private JTextField departureCodeField;
    private JTextField departurePortField;
    private JTextField destinationCodeField;
    private JTextField destinationPortField;
    private JTextField deliveryDateField;
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Indent Column");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new FormDebugExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        fileNumberField       = new JTextField();
        rfqNumberField        = new JTextField();
        blNumberField         = new JTextField();
        mblNumberField        = new JTextField();
        customerKeyField      = new JTextField();
        customerAddressField  = new JTextField();
        customerAddressField.setEditable(false);
        shipperKeyField       = new JTextField();
        shipperAddressField   = new JTextField();
        shipperAddressField.setEditable(false);
        consigneeKeyField     = new JTextField();
        consigneeAddressField = new JTextField();
        consigneeAddressField.setEditable(false);
        departureCodeField    = new JTextField();
        departurePortField    = new JTextField();
        departurePortField.setEditable(false);
        destinationCodeField  = new JTextField();
        destinationPortField  = new JTextField();
        destinationPortField.setEditable(false);
        deliveryDateField     = new JTextField();
    }
    // Building *************************************************************
    /**
     * Builds the pane.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        
        FormLayout layout = new FormLayout(
                "12dlu, pref, 3dlu, max(45dlu;min), 2dlu, min, 2dlu, min, 2dlu, min, ",
                "");
        layout.setColumnGroups(new int[][] { { 4, 6, 8, 10 } });
        
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.setLeadingColumnOffset(1);
        builder.appendSeparator("General");
        builder.append("File Number",    fileNumberField, 7);
        builder.append("RFQ Number",     rfqNumberField,  7);
        builder.append("BL/MBL",         blNumberField, mblNumberField); builder.nextLine();
        builder.appendSeparator("Addresses");
        builder.append("Customer",       customerKeyField,  customerAddressField,  5);
        builder.append("Shipper",        shipperKeyField,   shipperAddressField,   5);
        builder.append("Consignee",      consigneeKeyField, consigneeAddressField, 5);
        builder.appendSeparator("Transport");
        builder.append("Departure",      departureCodeField,   departurePortField,   5);
        builder.append("Destination",    destinationCodeField, destinationPortField, 5);
        builder.append("Delivery Date",  deliveryDateField); builder.nextLine();
        
        return builder.getPanel();
    }

}





Build button stacks using the ButtonStackBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import java.awt.Insets;
import javax.swing.*;
import com.jgoodies.forms.builder.ButtonStackBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how to build button stacks using the ButtonStackBuilder.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.12 $
 * 
 * @see     ButtonStackBuilder
 */
public class ButtonStacksExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Button Stacks");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new ButtonStacksExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add(buildButtonStackNoBuilder(),    "No Builder");
        tabbedPane.add(buildButtonStackWithBuilder(),  "Builder");
        tabbedPane.add(buildButtonStackRelated(),      "Related");
        tabbedPane.add(buildButtonStackUnrelated(),    "Unrelated ");
        tabbedPane.add(buildButtonStackMixedDefault(), "Mix");
        tabbedPane.add(buildButtonStackMixedNarrow(),  "Mix Narrow");
        return tabbedPane;
    }
    
    private Component buildButtonStackNoBuilder() {
        JPanel buttonStack = new JPanel(
            new FormLayout("p", "p, 4px, p"));
        buttonStack.add(new JButton("Yes"), "1, 1");                      
        buttonStack.add(new JButton("No"),  "1, 3");   
        
        return wrap(buttonStack, 
            "This stack has been built without a ButtonStackBuilder.\n" +
            " o The buttons have no minimum width and\n" +
            " o The gaps use pixel sizes and do not scale with the font\n" +
            " o The gaps may become inconsisten in a team.");
    }
    private Component buildButtonStackWithBuilder() {
        ButtonStackBuilder builder = new ButtonStackBuilder();
        builder.addGridded(new JButton("Yes"));                      
        builder.addRelatedGap();                   
        builder.addGridded(new JButton("No"));   
        return wrap(builder.getPanel(),
            "This stack has been built with a ButtonStackBuilder.\n" +
            " o The buttons have a minimum width and\n" +
            " o The gap uses a logical size that follows a style guide.");
    }
    
    private Component buildButtonStackRelated() {
        ButtonStackBuilder builder = new ButtonStackBuilder();
        builder.addGridded(new JButton("Related"));   
        builder.addRelatedGap();                   
        builder.addGridded(new JButton("Related"));   
        builder.addRelatedGap();                   
        builder.addGridded(new JButton("Related"));   
        return wrap(builder.getPanel(),
            "This stack uses the logical gap for related buttons.\n");
    }
    
    private Component buildButtonStackUnrelated() {
        ButtonStackBuilder builder = new ButtonStackBuilder();
        builder.addGridded(new JButton("Unrelated"));   
        builder.addUnrelatedGap();                   
        builder.addGridded(new JButton("Unrelated"));   
        builder.addUnrelatedGap();                   
        builder.addGridded(new JButton("Unrelated"));   
        return wrap(builder.getPanel(),
            "This stack uses the logical gap for unrelated buttons.\n");
    }
    
    private Component buildButtonStackMixedDefault() {
        ButtonStackBuilder builder = new ButtonStackBuilder();
        builder.addGridded(new JButton("OK"));   
        builder.addRelatedGap();                   
        builder.addGridded(new JButton("Cancel"));   
        builder.addUnrelatedGap();
        builder.addGridded(new JButton("Help"));
        builder.addUnrelatedGap();
        builder.addGlue();
        builder.addFixed(new JButton("Copy to Clipboard"));
        return wrap(builder.getPanel(),
            "Demonstrates a glue (between Help and Copy),\n" +
            "has related and unrelated buttons and\n" +
            "a button with long label with the default margin.");
    }
    
    private Component buildButtonStackMixedNarrow() {
        ButtonStackBuilder builder = new ButtonStackBuilder();
        builder.addGridded(new JButton("OK"));   
        builder.addRelatedGap();                   
        builder.addGridded(new JButton("Cancel"));   
        builder.addUnrelatedGap();
        builder.addGridded(new JButton("Help"));
        builder.addUnrelatedGap();
        builder.addGlue();
        builder.addGridded(new JButton("Copy to Clipboard"));
        return wrap(builder.getPanel(),
            "Demonstrates a glue (between Help and Copy),\n" +
            "has related and unrelated buttons and\n" +
            "a button with long label with a narrow margin.\n\n"+
      "Note that some look&feels do not support\n" +
      "the narrow margin feature, and conversely,\n" +
      "others have only narrow margins.");
    }
    
    
    // Helper Code ************************************************************
    
    private static Component wrap(Component buttonStack, String text) {
      JTextArea textArea = new JTextArea(text);
      textArea.setMargin(new Insets(6, 10, 4, 6));
      Component textPane = new JScrollPane(textArea);
      
        FormLayout layout = new FormLayout(
                        "fill:100dlu:grow, 6dlu, p",
                        "fill:56dlu:grow");
        JPanel panel = new JPanel(layout);
        CellConstraints cc = new CellConstraints();
        panel.setBorder(Borders.DIALOG_BORDER);
        panel.add(textPane,     cc.xy(1, 1));
        panel.add(buttonStack,  cc.xy(3, 1));                   
        return panel;
    }
}





Build panels component orientation: left-to-right vs. right-to-left

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import java.awt.Insets;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.layout.FormSpec.DefaultAlignment;
/**
 * Demonstrates how to build panels that honor or ignore the current
 * component orientation: left-to-right vs. right-to-left.<p>
 * 
 * This example uses a utility class that may be moved to the extras or 
 * to the Forms core in a future version. The tricky part is the abstract 
 * definition of column specifications and cell constraints.<p>
 *  
 * The example below utilizes the <code>OrientationUtils</code> to flip
 * column specification defaul alignments and to reverse the order of
 * column specifications. Cell constraints need to be adjusted too; this
 * example avoids the problem by using a builder that creates <em>all</em>
 * cell constraints.<p>
 * 
 * You can find information about the latest additions regarding the
 * Forms support for different component orientations in the comments for 
 * 



== Columns and rows are specified before the panel is filled with components ==






   
  <!-- start source code -->
   
    <source lang="java">

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Combines the <code>FormLayout</code> with the <code>PanelBuilder</code>. 
 * Columns and rows are specified before the panel is filled 
 * with components. The builder"s cursor is used to determine the location 
 * of the next component. And the builder"s convenience methods are used 
 * to add labels and separators.<p>
 *  
 * This panel building style is intended for learning purposes only.
 * The recommended style is demonstrated in the {@link DefaultFormBuilderExample}. 
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.8 $
 * 
 * @see  PlainExample
 * @see  RowCounterExample
 * @see  DefaultFormBuilderExample
 */
public class DynamicRowsExample {
    private JTextField identifierField;
    private JTextField ptiField;
    private JTextField powerField;
    private JTextField lenField;
    private JTextField daField;
    private JTextField diField;
    private JTextField da2Field;
    private JTextField di2Field;
    private JTextField rField;
    private JTextField dField;
    private JComboBox  locationCombo;
    private JTextField kFactorField;
    private JCheckBox  holesCheckBox;
    private JCheckBox  slotsCheckBox;

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Dynamic Rows");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new DynamicRowsExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    
    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        identifierField = new JTextField();
        ptiField        = new JTextField();
        powerField      = new JTextField();
        lenField        = new JTextField();
        daField         = new JTextField();
        diField         = new JTextField();
        da2Field        = new JTextField();
        di2Field        = new JTextField();
        rField          = new JTextField();
        dField          = new JTextField();
        locationCombo   = createLocationComboBox();
        kFactorField    = new JTextField();
        holesCheckBox   = new JCheckBox("Has radial holes", true);
        slotsCheckBox   = new JCheckBox("Has longitudinal slots");
    }
    /**
     * Creates and returns a combo box for the locations.
     * 
     * @return a combo box for three locations
     */
    private JComboBox createLocationComboBox() {
        return new JComboBox(
            new String[] {
                "Propeller nut thread",
                "Stern tube front area",
                "Shaft taper" });
    }

    // Building *************************************************************
    /**
     * Builds the pane.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        FormLayout layout = new FormLayout(
                "right:max(40dlu;pref), 3dlu, 70dlu, 7dlu, "
              + "right:max(40dlu;pref), 3dlu, 70dlu",
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, "
              + "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, "
              + "p, 3dlu, p, 3dlu, p, 3dlu, p");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.addSeparator("Segment");
        builder.nextLine(2);
        builder.addLabel("Identifier");         builder.nextColumn(2);
        builder.add(identifierField);
        builder.nextLine(2);
        builder.addLabel("PTI [kW]");           builder.nextColumn(2);
        builder.add(ptiField);                  builder.nextColumn(2);
        builder.addLabel("Power [kW]");         builder.nextColumn(2);
        builder.add(powerField);
        builder.nextLine(2);
        builder.addLabel("len [mm]");           builder.nextColumn(2);
        builder.add(lenField);
        builder.nextLine(2);
        builder.addSeparator("Diameters");
        builder.nextLine(2);
        builder.addLabel("da [mm]");            builder.nextColumn(2);
        builder.add(daField);                   builder.nextColumn(2);
        builder.addLabel("di [mm]");            builder.nextColumn(2);
        builder.add(diField);
        builder.nextLine(2);
        builder.addLabel("da2 [mm]");           builder.nextColumn(2);
        builder.add(da2Field);                  builder.nextColumn(2);
        builder.addLabel("di2 [mm]");           builder.nextColumn(2);
        builder.add(di2Field);
        builder.nextLine(2);
        builder.addLabel("R [mm]");             builder.nextColumn(2);
        builder.add(rField);                    builder.nextColumn(2);
        builder.addLabel("D [mm]");             builder.nextColumn(2);
        builder.add(dField);
        builder.nextLine(2);
        builder.addSeparator("Criteria");
        builder.nextLine(2);
        builder.addLabel("Location");           builder.nextColumn(2);
        builder.add(locationCombo);             builder.nextColumn(2);
        builder.addLabel("k-factor");           builder.nextColumn(2);
        builder.add(kFactorField);
        builder.nextLine(2);
        builder.addLabel("Holes");              builder.nextColumn(2);
        builder.setColumnSpan(5);
        builder.add(holesCheckBox);
        builder.setColumnSpan(1);
        builder.nextLine(2);
        builder.addLabel("Slots");              builder.nextColumn(2);
        builder.setColumnSpan(5);
        builder.add(slotsCheckBox);
        builder.setColumnSpan(1);
        
        return builder.getPanel();
    }

}





Columns and rows are specified before the panel is filled with components 1

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates a typical use of the FormLayout.
 * Columns and rows are specified before the panel is filled with
 * components, and the panel is filled with a PanelBuilder.<p>
 * 
 * Unlike the PlainExample, this implementation can delegate
 * the component creation for text labels and titled separators
 * to the builder.<p>
 * 
 * This panel building style is recommended for panels with
 * a medium number of rows and components. If the panel has more rows, 
 * you may consider using a row variable to address the current row.
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.9 $
 * 
 * @see     PanelBuilder
 * @see  RowCounterExample
 * @see  DynamicRowsExample
 * @see  DefaultFormBuilderExample
 */
public class PanelBuilderExample {
    private JTextField companyNameField;
    private JTextField contactPersonField;
    private JTextField orderNoField;
    private JTextField inspectorField;
    private JTextField referenceNoField;
    private JComboBox  approvalStatusComboBox;
    private JTextField shipYardField;
    private JTextField registerNoField;
    private JTextField hullNumbersField;
    private JComboBox  projectTypeComboBox;
 
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: PanelBuilder");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new PanelBuilderExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    
    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        companyNameField       = new JTextField();
        contactPersonField     = new JTextField();
        orderNoField           = new JTextField();
        inspectorField         = new JTextField();
        referenceNoField       = new JTextField();
        approvalStatusComboBox = createApprovalStatusComboBox();
        shipYardField          = new JTextField();
        registerNoField        = new JTextField();
        hullNumbersField       = new JTextField();
        projectTypeComboBox    = createProjectTypeComboBox();
    }
    /**
     * Creates and returns a combo box for the approval states.
     * 
     * @return a combo box for the approval status
     */
    private JComboBox createApprovalStatusComboBox() {
        return new JComboBox(
            new String[] { "In Progress", "Finished", "Released" });
    }
    /**
     * Creates and returns a combo box for the project types.
     * 
     * @return a combo box for the project type
     */
    private JComboBox createProjectTypeComboBox() {
        return new JComboBox(
            new String[] { "New Building", "Conversion", "Repair" });
    }

    // Building *************************************************************
    /**
     * Builds the pane.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        FormLayout layout = new FormLayout(
                "right:max(40dlu;pref), 3dlu, 70dlu, 7dlu, "
              + "right:max(40dlu;pref), 3dlu, 70dlu",
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, " +
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, " +
                "p, 3dlu, p, 3dlu, p, 3dlu, p");
                
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        // Fill the table with labels and components.
        CellConstraints cc = new CellConstraints();
        builder.addSeparator("Manufacturer", cc.xyw(1,  1, 7));
        builder.addLabel("Company",          cc.xy (1,  3));
        builder.add(companyNameField,        cc.xyw(3,  3, 5));
        builder.addLabel("Contact",          cc.xy (1,  5));
        builder.add(contactPersonField,      cc.xyw(3,  5, 5));
        builder.addLabel("Order No",         cc.xy (1,  7));
        builder.add(orderNoField,            cc.xy (3,  7));
        builder.addSeparator("Inspector",    cc.xyw(1,  9, 7));
        builder.addLabel("Name",             cc.xy (1, 11));
        builder.add(inspectorField,          cc.xyw(3, 11, 5));
        builder.addLabel("Reference No",     cc.xy (1, 13));
        builder.add(referenceNoField,        cc.xy (3, 13));
        builder.addLabel("Status",           cc.xy (1, 15));
        builder.add(approvalStatusComboBox,  cc.xy (3, 15));
        
        builder.addSeparator("Ship",         cc.xyw(1, 17, 7));
        builder.addLabel("Shipyard",         cc.xy (1, 19));
        builder.add(shipYardField,           cc.xyw(3, 19, 5));
        builder.addLabel("Register No",      cc.xy (1, 21));
        builder.add(registerNoField,         cc.xy (3, 21));
        builder.addLabel("Hull No",          cc.xy (5, 21));
        builder.add(hullNumbersField,        cc.xy (7, 21));
        builder.addLabel("Project Type",     cc.xy (1, 23));
        builder.add(projectTypeComboBox,     cc.xy (3, 23));
        
        return builder.getPanel();
    }
    
}





Compares approaches how to append a custom area at the end of a panel built with the DefaultFormBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
/**
 * Compares approaches how to append a custom area at the end of
 * a panel built with the DefaultFormBuilder:<ol>
 * <li> using two custom rows to align the leading label,
 * <li> using a single custom row with label on top,
 * <li> using a separator.
 * </ol>
 * These differ in the position of the leading "Feedback" label,
 * and in turn in the alignment of font baselines between label
 * and the text area. 
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.8 $
 * 
 * @see     DefaultFormBuilder
 * @see     DefaultFormWithCustomRowsExample
 */
public class DefaultFormWithCustomAreasExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Custom Areas");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new DefaultFormWithCustomAreasExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Building ***************************************************************
    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add(buildCustomAreaWithAlignedLabelPanel(), "Aligned label");
        tabbedPane.add(buildCustomAreaWithTopLabelPanel(),     "Top label");
        tabbedPane.add(buildCustomAreaWithSeparatorPanel(),    "Separator");
        return tabbedPane;
    }
    
    
    private DefaultFormBuilder buildPanelHeader() {
        FormLayout layout = new FormLayout(
                "right:pref, 3dlu, min:grow", 
                "");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.setRowGroupingEnabled(true);
        
        builder.appendSeparator("Customer Data");
        builder.append("Last Name",  new JTextField());
        builder.append("First Name", new JTextField());
        builder.append("Street",     new JTextField());
        builder.append("Email",      new JTextField());
        return builder;
    }
    
    
    /**
     * Demonstrates how to append a larger custom area at the end of
     * a panel that is build with a {@link DefaultFormBuilder}.<p>
     * 
     * We add a gap and a single custom row that grows and that
     * is filled vertically (where the default is center vertically).
     * The area uses a standard leading label.
     * 
     * @return the custom area panel with aligned labels
     */
    private JComponent buildCustomAreaWithAlignedLabelPanel() {
        DefaultFormBuilder builder = buildPanelHeader();
        CellConstraints cc = new CellConstraints();
        builder.append("Feedback");
        builder.appendRow(new RowSpec("0:grow"));
        builder.add(new JScrollPane(new JTextArea("Feedback - font baselines shall be aligned")),
                    cc.xywh(builder.getColumn(), builder.getRow(), 1, 2, "fill, fill"));
        return builder.getPanel();
    }

    /**
     * Demonstrates how to append two custom areas at the end of
     * a panel that is build with a DefaultFormBuilder.
     * 
     * @return the custom area panel with label in the top
     */
    private JComponent buildCustomAreaWithTopLabelPanel() {
        DefaultFormBuilder builder = buildPanelHeader();
        CellConstraints cc = new CellConstraints();
        builder.appendRow(builder.getLineGapSpec());
        builder.appendRow(new RowSpec("top:28dlu:grow"));
        builder.nextLine(2);
        builder.append("Feedback");
        builder.add(new JScrollPane(new JTextArea("Feedback - likely the baselines are not aligned")),
                    cc.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
        return builder.getPanel();
    }
    
    /**
     * Demonstrates how to append a larger custom area at the end of
     * a panel that is build with a DefaultFormBuilder.<p>
     * 
     * We add a gap and a single custom row that grows and that
     * is filled vertically (where the default is center vertically).
     * The area is separated by a titled separator and it is indented
     * using an empty leading label.
     * 
     * @return the custom area panel with separators
     */
    private JComponent buildCustomAreaWithSeparatorPanel() {
        DefaultFormBuilder builder = buildPanelHeader();
        
        builder.appendSeparator("Customer Feedback");
        builder.appendRow(builder.getLineGapSpec());
        builder.appendRow(new RowSpec("fill:28dlu:grow"));
        builder.nextLine(2);
        builder.append("", new JScrollPane(new JTextArea()));
        return builder.getPanel();
    }

 }





Create and configure a layout, create a builder, add components

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Quickly introduces the most important features of the FormLayout:
 * create and configure a layout, create a builder, add components.<p>
 * 
 * Note that this class is not a JPanel subclass;
 * it justs uses a JPanel as layout container that will be returned
 * by <code>#buildPanel()</code>. 
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.8 $
 */
public class QuickStartExample {
    private JTextField companyField;
    private JTextField contactField;
    private JTextField ptiField;
    private JTextField powerField;
    private JTextField radiusField;
    private JTextField diameterField;
 
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Quick Start");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new QuickStartExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    
    // Component Creation and Initialization **********************************
    /**
     * Creates, intializes and configures the UI components. 
     * Real applications may further bind the components to underlying models. 
     */
    private void initComponents() {
        companyField  = new JTextField();
        contactField  = new JTextField();
        ptiField      = new JTextField(6);
        powerField    = new JTextField(10);
        radiusField   = new JTextField(8);
        diameterField = new JTextField(8);
    }
    // Building *************************************************************
    /**
     * Builds the panel. Initializes and configures components first,
     * then creates a FormLayout, configures the layout, creates a builder,
     * sets a border, and finally adds the components.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        // Separating the component initialization and configuration
        // from the layout code makes both parts easier to read.
        initComponents();
        // Create a FormLayout instance on the given column and row specs. 
        // For almost all forms you specify the columns; sometimes rows are 
        // created dynamically. In this case the labels are right aligned.
        FormLayout layout = new FormLayout(
                "right:pref, 3dlu, pref, 7dlu, right:pref, 3dlu, pref", // cols
                "p, 3dlu, p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p");      // rows
        
        // Specify that columns 1 & 5 as well as 3 & 7 have equal widths.       
        layout.setColumnGroups(new int[][]{{1, 5}, {3, 7}});
        
        // Create a builder that assists in adding components to the container. 
        // Wrap the panel with a standardized border.
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        // Obtain a reusable constraints object to place components in the grid.
        CellConstraints cc = new CellConstraints();
        // Fill the grid with components; the builder offers to create
        // frequently used components, e.g. separators and labels.
        
        // Add a titled separator to cell (1, 1) that spans 7 columns.
        builder.addSeparator("General",   cc.xyw(1,  1, 7));
        builder.addLabel("Company",       cc.xy (1,  3));
        builder.add(companyField,         cc.xyw(3,  3, 5));
        builder.addLabel("Contact",       cc.xy (1,  5));
        builder.add(contactField,         cc.xyw(3,  5, 5));
        builder.addSeparator("Propeller", cc.xyw(1,  7, 7));
        builder.addLabel("PTI [kW]",      cc.xy (1,  9));
        builder.add(ptiField,             cc.xy (3,  9));
        builder.addLabel("Power [kW]",    cc.xy (5,  9));
        builder.add(powerField,           cc.xy (7,  9));
        builder.addLabel("R [mm]",        cc.xy (1, 11));
        builder.add(radiusField,          cc.xy (3, 11));
        builder.addLabel("D [mm]",        cc.xy (5, 11));
        builder.add(diameterField,        cc.xy (7, 11));
        
        // The builder holds the layout container that we now return.
        return builder.getPanel();
    }
    
}





Demonstrates a frequent pitfall when specifying a growing row

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import javax.swing.text.JTextComponent;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.debug.FormDebugUtils;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates a frequent pitfall when specifying a growing row. 
 * In this layout a row grows, but the text area in that row is centered 
 * and doesn"t "grow". In other words, the area doesn"t fill 
 * the available vertical space. 
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.2 $
 */
public class VerticalGrowthExample {
    // UI Components **********************************************************
    
    private JTextComponent notesArea;
    
    // Self Launch ************************************************************
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Vertical Growth");
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        JComponent panel = new VerticalGrowthExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.setSize(500, 400);
        frame.show();
    }
    
    
    // Component Initialization ***********************************************
    
    /**
     * Creates and configures the UI components.
     */
    private void initComponents() {
        notesArea  = new JTextArea(
                "This text area doesn"t consume the available vertical space.\n\n"
                + "The row is specified as "pref:grow", and so the row grows.\n"
                + "It"s just that the text area doesn"t fill the row"s vertical space.\n\n"
                + "Since the row"s alignment is not explicitly defined,\n"
                + "it uses the "center" alignment as default. But in this case\n"
                + "we want to "fill". The row spec should read: "fill:pref:grow"."
                );
    }

    // Building ***************************************************************
    /**
     * Builds and returns a panel with a title and scrollable text area.<p>
     * 
     * The FormDebugUtils dumps
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents(); 
        
        FormLayout layout = new FormLayout(
                "pref:grow",
                "pref, 3dlu, pref:grow" // Correct: "pref, 3dlu, fill:pref:grow"  
                );
        
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.addTitle("An Example for FAQ #3.3", cc.xy(1, 1));
        builder.add(new JScrollPane(notesArea),     cc.xy(1, 3));
        
        FormDebugUtils.dumpRowSpecs(layout);
        FormDebugUtils.dumpConstraints(builder.getPanel());
        return builder.getPanel();
    }
    
    
 }





Demonstrates a pure use of the FormLayout

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.factories.DefaultComponentFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates a <i>pure</i> use of the FormLayout.
 * Columns and rows are specified before the panel is filled with
 * components. And the panel is filled without a builder.<p>
 * 
 * This panel building style is simple but not recommended. Other panel
 * building styles use a builder to fill the panel and/or create
 * form rows dynamically. See the {@link PanelBuilderExample} for 
 * a slightly better panel building style that can use the builder
 * to create text labels and separators. 
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.8 $
 * 
 * @see     PanelBuilderExample
 * @see  RowCounterExample
 * @see  DynamicRowsExample
 * @see  DefaultFormBuilderExample
 */
public class PlainExample {
    private JTextField companyNameField;
    private JTextField contactPersonField;
    private JTextField orderNoField;
    private JTextField inspectorField;
    private JTextField referenceNoField;
    private JComboBox  approvalStatusComboBox;
    private JTextField shipYardField;
    private JTextField registerNoField;
    private JTextField hullNumbersField;
    private JComboBox  projectTypeComboBox;
 
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Plain Building");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new PlainExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    
    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        companyNameField       = new JTextField();
        contactPersonField     = new JTextField();
        orderNoField           = new JTextField();
        inspectorField         = new JTextField();
        referenceNoField       = new JTextField();
        approvalStatusComboBox = createApprovalStatusComboBox();
        shipYardField          = new JTextField();
        registerNoField        = new JTextField();
        hullNumbersField       = new JTextField();
        projectTypeComboBox    = createProjectTypeComboBox();
    }
    /**
     * Creates and returns a combo box for the approval states.
     * 
     * @return a combo box for the approval status
     */
    private JComboBox createApprovalStatusComboBox() {
        return new JComboBox(
            new String[] { "In Progress", "Finished", "Released" });
    }
    /**
     * Creates and returns a combo box for the project types.
     * 
     * @return a combo box for the project type
     */
    private JComboBox createProjectTypeComboBox() {
        return new JComboBox(
            new String[] { "New Building", "Conversion", "Repair" });
    }

    // Building *************************************************************
    /**
     * Builds the pane.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        FormLayout layout = new FormLayout(
                "right:max(40dlu;pref), 3dlu, 70dlu, 7dlu, "
              + "right:max(40dlu;pref), 3dlu, 70dlu",
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, " +
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, " +
                "p, 3dlu, p, 3dlu, p, 3dlu, p");
                
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        // Fill the table with labels and components.
        CellConstraints cc = new CellConstraints();
        panel.add(createSeparator("Manufacturer"),  cc.xyw(1,  1, 7));
        panel.add(new JLabel("Company"),            cc.xy (1,  3));
        panel.add(companyNameField,                 cc.xyw(3,  3, 5));
        panel.add(new JLabel("Contact"),            cc.xy (1,  5));
        panel.add(contactPersonField,               cc.xyw(3,  5, 5));
        panel.add(new JLabel("Order No"),           cc.xy (1, 7));
        panel.add(orderNoField,                     cc.xy (3, 7));
        panel.add(createSeparator("Inspector"),     cc.xyw(1, 9, 7));
        panel.add(new JLabel("Name"),               cc.xy (1, 11));
        panel.add(inspectorField,                   cc.xyw(3, 11, 5));
        panel.add(new JLabel("Reference No"),       cc.xy (1, 13));
        panel.add(referenceNoField,                 cc.xy (3, 13));
        panel.add(new JLabel("Status"),             cc.xy (1, 15));
        panel.add(approvalStatusComboBox,           cc.xy (3, 15));
        
        panel.add(createSeparator("Ship"),          cc.xyw(1, 17, 7));
        panel.add(new JLabel("Shipyard"),           cc.xy (1, 19));
        panel.add(shipYardField,                    cc.xyw(3, 19, 5));
        panel.add(new JLabel("Register No"),        cc.xy (1, 21));
        panel.add(registerNoField,                  cc.xy (3, 21));
        panel.add(new JLabel("Hull No"),            cc.xy (5, 21));
        panel.add(hullNumbersField,                 cc.xy (7, 21));
        panel.add(new JLabel("Project Type"),       cc.xy (1, 23));
        panel.add(projectTypeComboBox,              cc.xy (3, 23));
        
        return panel;
    }
    
    /**
     * Creates and answer a separator with a label in the left hand side.
     * 
     * @param text   the label"s text
     * @return a separator with label in the left hand side
     */
    private Component createSeparator(String text) {
        return DefaultComponentFactory.getInstance().createSeparator(text);
    }
}





Demonstrates how a JTextArea"s preferred size grows with the container if no columns and rows are set

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ruponentAdapter;
import java.awt.event.ruponentEvent;
import javax.swing.*;
import javax.swing.border.rupoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how a JTextArea"s preferred size grows with the container
 * if no columns and rows are set.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.3 $
 */
public class GrowingTextAreaExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Growing Text Area");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new GrowingTextAreaExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    
    
    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        
        String example1Text = 
            "Here the layout uses a fixed initial size of 200 dlu. "
          + "The area"s minimum and preferred sizes will be ignored. "
          + "And so, the area will grow and shrink.";
      
        tabbedPane.add("1", 
              buildTab("Fixed Size (Good)",
                       "fill:200dlu:grow", 
                       createArea(example1Text, true, 0, null)));
      
        String example2Text =
            "This text area has line wrapping disabled\n"
          + "and uses a hand-wrapped text (using "\\n").\n\n"
          + "Its minimum and preferred sizes are constant and so,\n"
          + "the area will grow but shrink down to its minimum size.";
      
        tabbedPane.add("2", 
              buildTab("Pref Size, Line Wrap Disabled (Good)",
                       "fill:pref:grow", 
                       createArea(example2Text, false, 0, null)));
      
        String example3Text = 
                  "This text area grows horizontally and will never shrink again. "
                + "Since line wrapping is enabled, "
                + "the area"s preferred size is defined by its size. "
                + "(See BasicTextAreaUI#getPreferredSize(Component).\n\n"
                + "If the layout container grows, the layout manager "
                + "sets a larger size, and hence, the preferred size grows."
                + "The FormLayout honors the area"s preferred size to compute "
                + "the new column width, and so the area won"t shrink again.\n\n"
                + "Even if you use a "default" width the column won"t shrink.";
        tabbedPane.add("3", 
                buildTab("Pref Size, Line Wrap Enabled (Never Shrinks)",
                         "fill:pref:grow", 
                         createArea(example3Text, true, 0, null)));
        
        String example4Text = 
            "This text area grows but never shrinks. "
            + "Since line wrapping is enabled, the area"s "
            + "minimum and preferred sizes are defined by its size.\n\n"
            + "If the layout container grows, the layout manager "
            + "sets a larger size, and hence, the minimum and preferred sizes grow. "
            + "If the layout container shrinks, the layout manager can shrink "
            + "the column width down to the area"s minimum width. "
            + "But the minimum size is like the preferred size determined "
            + "by the size previously set, and so, the column won"t shrink.\n\n"
            + "A solution to this problem is to set a custom minimum size.";
        
        tabbedPane.add("4", 
                buildTab("Default Size, Line Wrap Enabled (Never Shrinks)",
                         "fill:default:grow", 
                         createArea(example4Text, true, 0, null)));
        
        String example5Text = 
            "This text area has uses a column width of 30 characters. "
            + "But that just affects the initial preferred and minimum size."
            + "The area grows and won"t shrink again - just as in tabs 3 and 4.";
        
        tabbedPane.add("5", 
                buildTab("Default Size, Line Wrap Enabled, Columns Set (Never Shrinks)",
                         "fill:default:grow", 
                         createArea(example5Text, true, 30, null)));
        
        String example6Text = 
            "This text area grows and shrinks. "
            + "Since line wrapping is enabled, "
            + "the area"s preferred size is defined by its size. "
            + "Here a custom minimum size (100, 32) has been set.\n\n"
            + "If the layout container grows, the layout manager "
            + "sets a larger size, and hence, the preferred size grows. "
            + "However, if the layout container shrinks, the layout can "
            + "shrink the column down to the area"s minimum width, which is 100; "
            + "the minimum size is independent from the size previously set.";
        
        tabbedPane.add("6", 
                buildTab("Default Size, Line Wrap Enabled, Min Size Set (Good)",
                         "fill:default:grow", 
                         createArea(example6Text, true, 0, new Dimension(100, 32))));
        
        return tabbedPane;
    }
    
    
    private JTextArea createArea(
            String text,
            boolean lineWrap, 
            int columns,
            Dimension minimumSize) {
        JTextArea area  = new JTextArea(text);
        area.setBorder(new CompoundBorder(
                new LineBorder(Color.GRAY),
                new EmptyBorder(1, 3, 1, 1)));
        area.setLineWrap(lineWrap);
        area.setWrapStyleWord(true);
        area.setColumns(columns);
        if (minimumSize != null) {
            area.setMinimumSize(new Dimension(100, 32));
        }
        return area;
    }
    private JComponent buildTab(String title, String columnSpec, JTextArea area) {
        JLabel columnSpecLabel = new JLabel(columnSpec);
        columnSpecLabel.setHorizontalAlignment(JLabel.CENTER);
        
        FormLayout layout = new FormLayout(
                columnSpec, 
                "pref, 9dlu, pref, 3dlu, fill:default:grow, 9dlu, pref");
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.addTitle(title,           cc.xy(1, 1));
        builder.add(columnSpecLabel,      cc.xy(1, 3));
        builder.add(area,                 cc.xy(1, 5));
        builder.add(buildInfoPanel(area), cc.xy(1, 7));
        return builder.getPanel();
    }
    
    
    private JComponent buildInfoPanel(JTextArea area) {
        JLabel sizeLabel      = new JLabel();
        JLabel minSizeLabel   = new JLabel();
        JLabel prefSizeLabel  = new JLabel();
        JLabel lineWrapLabel  = new JLabel(area.getLineWrap() ? "enabled" : "disabled");
        JLabel customMinLabel = new JLabel(area.isMinimumSizeSet() ? "set" : "computed");
        JLabel columnsLabel   = new JLabel(area.getColumns() == 0 
                                            ? "not specified" 
                                            : String.valueOf(area.getColumns()));
        area.addComponentListener(new SizeChangeHandler(
                area, sizeLabel, minSizeLabel, prefSizeLabel));
        FormLayout layout = new FormLayout("pref, 4dlu, pref, 21dlu, pref, 4dlu, pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.append("Size:",      sizeLabel);
        builder.append("Line wrap:", lineWrapLabel);
        
        builder.append("Min size:",  minSizeLabel);
        builder.append("Min size:", customMinLabel);
        
        builder.append("Pref size:", prefSizeLabel);
        builder.append("Columns:",   columnsLabel);
        return builder.getPanel();
    }
    
    
    // Listens to area size changes and writes the formatted sizes to the given labels.
    private static class SizeChangeHandler extends ComponentAdapter {
        
        private final JTextArea area;
        private final JLabel    sizeLabel;
        private final JLabel    minSizeLabel;
        private final JLabel    prefSizeLabel;
        
        private SizeChangeHandler(
                JTextArea area,
                JLabel sizeLabel,
                JLabel minSizeLabel,
                JLabel prefSizeLabel) {
            this.area = area;
            this.sizeLabel = sizeLabel;
            this.minSizeLabel = minSizeLabel;
            this.prefSizeLabel = prefSizeLabel;
        }
        
        public void componentResized(ComponentEvent evt) {
            sizeLabel.setText(format(area.getSize()));
            minSizeLabel.setText(format(area.getMinimumSize()));
            prefSizeLabel.setText(format(area.getPreferredSize()));
        }
        
        private String format(Dimension d) {
            return String.valueOf(d.width) + ", " + d.height;
        }
        
    }
    
    
}





Demonstrates how to build button bars using a ButtonBarBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import java.awt.Insets;
import javax.swing.*;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how to build button bars using a ButtonBarBuilder.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.16 $
 * 
 * @see     ButtonBarBuilder
 * @see     com.jgoodies.forms.factories.ButtonBarFactory
 */
public class ButtonBarsExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Button Bars");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new ButtonBarsExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add(buildButtonBar1Panel(),      "No Builder");
        tabbedPane.add(buildButtonBar2Panel(),      "Builder");
        tabbedPane.add(buildButtonBar3Panel(),      "Related");
        tabbedPane.add(buildButtonBar4Panel(),      "Unrelated ");
        tabbedPane.add(buildButtonMixedBar1Panel(), "Mix");
        tabbedPane.add(buildButtonMixedBar2Panel(), "Mix Narrow");
        return tabbedPane;
    }
    
    private Component buildButtonBar1Panel() {
        JPanel buttonBar = new JPanel(
            new FormLayout("0:grow, p, 4px, p", "p"));
        buttonBar.add(new JButton("Yes"), "2, 1");                      
        buttonBar.add(new JButton("No"),  "4, 1");   
        
        return wrap(buttonBar, 
            "This bar has been built without a ButtonBarBuilder:\n" + " o buttons have no minimum widths,\n" +
      " o the button order is fixed left-to-right,\n" + " o gaps may be inconsistent between team members.");
    }
    private Component buildButtonBar2Panel() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.addGlue();
        builder.addGriddedButtons(new JButton[] {
                new JButton("Yes"),
                new JButton("No")
                });  
        return wrap(builder.getPanel(),
            "This bar has been built with a ButtonBarBuilder:\n" +
            " o buttons have a minimum widths,\n" +
      " o the button order honors the platform default,\n" +
        " o the button gap is a logical size that follows a style guide.");
    }
    
    private Component buildButtonBar3Panel() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.addGlue();
        builder.addGriddedButtons(new JButton[] {
                new JButton("One"),
                new JButton("Two"),
                new JButton("Three")
          });   
        return wrap(builder.getPanel(),
            "This bar uses the logical gap for related buttons.\n");
    }
    
    private Component buildButtonBar4Panel() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.addGlue();
        builder.addGridded(new JButton("One"));   
        builder.addUnrelatedGap();                   
        builder.addGridded(new JButton("Two"));   
        builder.addUnrelatedGap();                   
        builder.addGridded(new JButton("Three"));   
        return wrap(builder.getPanel(),
            "This bar uses the logical gap for unrelated buttons.\n" +
            "It is a little bit wider than the related gap.");
    }
    
    private Component buildButtonMixedBar1Panel() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.addGridded(new JButton("Help"));
        builder.addGlue();
        builder.addUnrelatedGap();
        builder.addFixed(new JButton("Copy to Clipboard"));
        builder.addUnrelatedGap();
        builder.addGriddedButtons(new JButton[] {
                new JButton("OK"),
                new JButton("Cancel")
          });   
        return wrap(builder.getPanel(),
            "Demonstrates a glue (between Help and the rest),\n" +
            "has related and unrelated buttons and an ungridded button\n" +
            "with a default margin (Copy to Clipboard).");
    }
    
    private Component buildButtonMixedBar2Panel() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.addGridded(new JButton("Help"));
        builder.addGlue();
        builder.addUnrelatedGap();
        builder.addFixedNarrow(new JButton("Copy to Clipboard"));
        builder.addUnrelatedGap();
        builder.addGriddedButtons(new JButton[] {
                new JButton("OK"),
                new JButton("Cancel")
        });   
        return wrap(builder.getPanel(),
            "Demonstrates a glue (between Help and the rest),\n" +
            "has related and unrelated buttons and an ungridded button\n" +
            "with a narrow margin (Copy to Clipboard).\n\n"+
      "Note that some look&feels do not support the narrow margin\n" +
      "feature, and conversely, others have only narrow margins.");
    }
    
    
    // Helper Code ************************************************************
    
    private static Component wrap(Component buttonBar, String text) {
      JTextArea textArea = new JTextArea(text);
      textArea.setMargin(new Insets(6, 10, 4, 6));
        Component textPane = new JScrollPane(textArea);
        
        FormLayout layout = new FormLayout(
                        "fill:100dlu:grow",
                        "fill:56dlu:grow, 4dlu, p");
        JPanel panel = new JPanel(layout);
        CellConstraints cc = new CellConstraints();
        panel.setBorder(Borders.DIALOG_BORDER);
        panel.add(textPane,    cc.xy(1, 1));
        panel.add(buttonBar,   cc.xy(1, 3));                   
        return panel;
    }
    
}





Demonstrates how to build button bars with a fixed button order

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how to build button bars with a fixed button order 
 * or with a button order that honors the platform"s style.
 * 
 * @author  Karsten Lentzsch
 * @version $Revision: 1.4 $
 * 
 * @see     ButtonBarBuilder
 * @see     com.jgoodies.forms.factories.ButtonBarFactory
 */
public class ButtonOrderExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Button Order");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new ButtonOrderExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * Builds and returns a panel that consists of three paragraphs
     * that demonstrate different button orders. Each paragraph contains
     * a button bar that is built from a button sequence, and another
     * bar that is built from individual buttons.
     * 
     * @return a panel that demonstrates button order
     */
    public JComponent buildPanel() {
        FormLayout layout = new FormLayout("right:pref:grow, 4dlu, pref");
        DefaultFormBuilder rowBuilder = new DefaultFormBuilder(layout);
        rowBuilder.setDefaultDialogBorder();
        
        rowBuilder.appendSeparator("Left to Right");
        rowBuilder.append("Ordered", buildButtonSequence(ButtonBarBuilder.createLeftToRightBuilder()));
        rowBuilder.append("Fixed",   buildIndividualButtons(ButtonBarBuilder.createLeftToRightBuilder()));
        
        rowBuilder.appendSeparator("Right to Left");
        rowBuilder.append("Ordered", buildButtonSequence(createRightToLeftBuilder()));
        rowBuilder.append("Fixed",   buildIndividualButtons(createRightToLeftBuilder()));
        
        rowBuilder.appendSeparator("Platform Default Order");
        rowBuilder.append("Ordered", buildButtonSequence(new ButtonBarBuilder()));
        rowBuilder.append("Fixed",   buildIndividualButtons(new ButtonBarBuilder()));
        
        return rowBuilder.getPanel();
    }
    
    
    /**
     * Builds and returns a button bar honoring the builder"s button order.
     * 
     * @param builder   the builder used to build the bar
     * @return a button bar that honors the builder"s button order
     */
    private Component buildButtonSequence(ButtonBarBuilder builder) {
        builder.addGriddedButtons(new JButton[] {
                new JButton("One"),
                new JButton("Two"),
                new JButton("Three")
        });
        return builder.getPanel();
    }

    /**
     * Builds and returns a button bar ignoring the builder"s button order.
     * Instead a fixed left to right order is used.
     * 
     * @param builder   the builder used to build the bar
     * @return a button bar with a fixed left to right button order
     */
    private Component buildIndividualButtons(ButtonBarBuilder builder) {
        builder.addGridded(new JButton("One"));
        builder.addRelatedGap();
        builder.addGridded(new JButton("Two"));
        builder.addRelatedGap();
        builder.addGridded(new JButton("Three"));
        return builder.getPanel();
    }
    
    /**
     * Creates and returns a button bar builder with a fixed
     * right-to-left button order. Unlike the factory method 
     * {@link ButtonBarBuilder#createLeftToRightBuilder()}
     * this method is useful for demonstration purposes only.
     *  
     * @return a ButtonBarBuilder with right-to-left button order
     */
    private static ButtonBarBuilder createRightToLeftBuilder() {
        ButtonBarBuilder builder = new ButtonBarBuilder();
        builder.setLeftToRightButtonOrder(false);
        return builder;
    }
    
}





Demonstrates how to find bugs in the layout using

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.debug.FormDebugUtils;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how to find bugs in the layout using 
 * the {@link FormDebugPanel} and the {@link FormDebugUtils}.<p>
 * 
 * The example also demonstrates efficient panel building with 
 * the DefaultFormBuilder. The builder has been configured 
 * to use a leading indent column.
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.12 $
 */
public class FormDebugExample {
    
    private JTextField fileNumberField;
    private JTextField rfqNumberField;
    private JTextField blNumberField;
    private JTextField mblNumberField;
    
    private JTextField customerKeyField;
    private JTextField customerAddressField;
    private JTextField shipperKeyField;
    private JTextField shipperAddressField;
    private JTextField consigneeKeyField;
    private JTextField consigneeAddressField;
    
    private JTextField departureCodeField;
    private JTextField departurePortField;
    private JTextField destinationCodeField;
    private JTextField destinationPortField;
    private JTextField deliveryDateField;
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Debug a Form");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new FormDebugExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        fileNumberField       = new JTextField();
        rfqNumberField        = new JTextField();
        blNumberField         = new JTextField();
        mblNumberField        = new JTextField();
        customerKeyField      = new JTextField();
        customerAddressField  = new JTextField();
        customerAddressField.setEditable(false);
        shipperKeyField       = new JTextField();
        shipperAddressField   = new JTextField();
        shipperAddressField.setEditable(false);
        consigneeKeyField     = new JTextField();
        consigneeAddressField = new JTextField();
        consigneeAddressField.setEditable(false);
        departureCodeField    = new JTextField();
        departurePortField    = new JTextField();
        departurePortField.setEditable(false);
        destinationCodeField  = new JTextField();
        destinationPortField  = new JTextField();
        destinationPortField.setEditable(false);
        deliveryDateField     = new JTextField();
    }
    
    // Building *************************************************************
    /**
     * Builds the panel.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        
        FormLayout layout = new FormLayout(
                "12dlu, pref, 3dlu, max(45dlu;min), 2dlu, min, 2dlu, min, 2dlu, min");
        layout.setColumnGroups(new int[][] { { 4, 6, 8, 10 } });
        
        DefaultFormBuilder builder = 
            new DefaultFormBuilder(layout, new FormDebugPanel());
            
        builder.setDefaultDialogBorder();
        builder.setLeadingColumnOffset(1);
        builder.appendSeparator("General");
        builder.append("File Number",    fileNumberField, 7);
        builder.append("RFQ Number",     rfqNumberField,  7);
        builder.append("BL/MBL",         blNumberField, mblNumberField); builder.nextLine();
        builder.appendSeparator("Addresses");
        builder.append("Customer",       customerKeyField,  customerAddressField,  5);
        builder.append("Shipper",        shipperKeyField,   shipperAddressField,   5);
        builder.append("Consignee",      consigneeKeyField, consigneeAddressField, 5);
        builder.appendSeparator("Transport");
        builder.append("Departure",      departureCodeField,   departurePortField,   5);
        builder.append("Destination",    destinationCodeField, destinationPortField, 5);
        builder.append("Delivery Date",  deliveryDateField); builder.nextLine();
        
        FormDebugUtils.dumpAll(builder.getPanel());
        
        return builder.getPanel();
    }

}





Demonstrates sizes: constant, minimum, preferred

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */
import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the basic FormLayout sizes: constant, minimum, preferred.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 */
public class BasicSizesExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.looks.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Basic Sizes");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new BasicSizesExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Horizontal", buildHorizontalSizesPanel());
        tabbedPane.add("Vertical",   buildVerticalSizesPanel());
        return tabbedPane;
    }
    
    
    private JComponent buildHorizontalSizesPanel() {
        FormLayout layout = new FormLayout(
            "pref, 12px, " + "75px, 25px, min, 25px, pref",   
            "pref, 12px, pref"); 
            
        // Create a panel that uses the layout.
        JPanel panel = new JPanel(layout);
        // Set a default border.
        panel.setBorder(Borders.DIALOG_BORDER);
        
        // Create a reusable CellConstraints instance.
        CellConstraints cc = new CellConstraints();
        // Add components to the panel.
        panel.add(new JLabel("75px"),  cc.xy(3, 1));
        panel.add(new JLabel("Min"),   cc.xy(5, 1));
        panel.add(new JLabel("Pref"),  cc.xy(7, 1));
        
        panel.add(new JLabel("new JTextField(15)"),  cc.xy(1, 3));
        panel.add(new JTextField(15),  cc.xy(3, 3));
        panel.add(new JTextField(15),  cc.xy(5, 3));
        panel.add(new JTextField(15),  cc.xy(7, 3));
        return panel;
    }
    
    
    private JComponent buildVerticalSizesPanel() {
        FormLayout layout = new FormLayout(
            "pref, 12px, pref",   
            "pref, 12px, 45px, 12px, min, 12px, pref"); 
            
        // Create a panel that uses the layout.
        JPanel panel = new JPanel(layout);
        // Set a default border.
        panel.setBorder(Borders.DIALOG_BORDER);
        
        // Create a reusable CellConstraints instance.
        CellConstraints cc = new CellConstraints();
        // Add components to the panel.
        panel.add(new JLabel("new JTextArea(10, 40)"), cc.xy(3, 1));
        
        panel.add(new JLabel("45px"),     cc.xy(1, 3));
        panel.add(new JLabel("Min"),      cc.xy(1, 5));
        panel.add(new JLabel("Pref"),     cc.xy(1, 7));
        
        panel.add(createTextArea(10, 40), cc.xy(3, 3));
        panel.add(createTextArea(10, 40), cc.xy(3, 5));
        panel.add(createTextArea(10, 40), cc.xy(3, 7));
        return panel;
    }
    
    private JComponent createTextArea(int rows, int cols) {
        return new JScrollPane(new JTextArea(rows, cols),
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    }
    
    
    // Helper Classes *********************************************************
    
    /**
     * Creates and returns a button that can have predefined minimum 
     * and preferred sizes. In the constructor you can specify or omit
     * the minimum width, height and preferred width/height.
     */
//    private static class SpecialSizeButton extends JButton {
//        
//        private final Dimension fixedMinimumSize;
//        private final Dimension fixedPreferredSize;
//        
//        private SpecialSizeButton(
//            String text,
//            Dimension fixedMinimumSize,
//            Dimension fixedPreferredSize) {
//            super(text);
//            this.fixedMinimumSize   = fixedMinimumSize;
//            this.fixedPreferredSize = fixedPreferredSize;
//            //putClientProperty("jgoodies.isNarrow", Boolean.TRUE);
//        }
//        
//        public Dimension getMinimumSize() {
//            Dimension d = super.getMinimumSize();
//            return new Dimension(
//                fixedMinimumSize.width  == -1 
//                    ? d.width 
//                    : fixedMinimumSize.width,
//                fixedMinimumSize.height == -1
//                    ? d.height
//                    : fixedMinimumSize.height);
//        }
//
//        public Dimension getPreferredSize() {
//            Dimension d = super.getPreferredSize();
//            return new Dimension(
//                fixedPreferredSize.width  == -1 
//                    ? d.width 
//                    : fixedPreferredSize.width,
//                fixedPreferredSize.height == -1
//                    ? d.height
//                    : fixedPreferredSize.height);
//        }
//    }
    
    
}





Demonstrates the basic FormLayout sizes: constant, minimum, preferred

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the basic FormLayout sizes: constant, minimum, preferred.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.10 $
 */
public class BoundedSizesExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Bounded Sizes");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new BoundedSizesExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Jumping 1",  buildJumping1Panel());
        tabbedPane.add("Jumping 2",  buildJumping2Panel());
        tabbedPane.add("Stable 1",   buildStable1Panel());
        tabbedPane.add("Stable 2",   buildStable2Panel());
        return tabbedPane;
    }
    
        
    private JComponent buildJumping1Panel() {
        FormLayout layout = new FormLayout( 
                "right:pref, 4dlu, max(35dlu;min), 2dlu, min, 2dlu, min, 2dlu, min, ",
                EDITOR_ROW_SPEC);
        return buildEditorGeneralPanel(layout);
    }
    
    private JComponent buildJumping2Panel() {
        FormLayout layout = new FormLayout(
                "right:pref, 4dlu, max(35dlu;min), 2dlu, min, 2dlu, min, 2dlu, min, ",
                EDITOR_ROW_SPEC);
        return buildEditorTransportPanel(layout);
    }
    
    private JComponent buildStable1Panel() {
        FormLayout layout = new FormLayout(
                "right:max(50dlu;pref), 4dlu, max(35dlu;min), 2dlu, min, 2dlu, min, 2dlu, min, ",
                EDITOR_ROW_SPEC);
        return buildEditorGeneralPanel(layout);
    }
    
    private JComponent buildStable2Panel() {
        FormLayout layout = new FormLayout(
                "right:max(50dlu;pref), 4dlu, max(35dlu;min), 2dlu, min, 2dlu, min, 2dlu, min, ",
                EDITOR_ROW_SPEC);
        return buildEditorTransportPanel(layout);
    }
    
    private static final String EDITOR_ROW_SPEC =
        "p, 3dlu, p, 3dlu, p, 3dlu, p";

    /**
     * Builds and answer the editor"s general tab for the given layout.
     * 
     * @param layout   the layout to be used
     * @return the editor"s general panel
     */
    private JComponent buildEditorGeneralPanel(FormLayout layout) {
        layout.setColumnGroups(new int[][] { { 3, 5, 7, 9 } });
        PanelBuilder builder = new PanelBuilder(layout);
            
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.addLabel("File number:",        cc.xy (1,  1));
        builder.add(new JTextField(),           cc.xyw(3,  1, 7));
        builder.addLabel("RFQ number:",         cc.xy (1,  3));
        builder.add(new JTextField(),           cc.xyw(3,  3, 7));
        builder.addLabel("Entry date:",         cc.xy (1,  5));
        builder.add(new JTextField(),           cc.xy (3,  5));
        builder.addLabel("Sales Person:",       cc.xy (1,  7));
        builder.add(new JTextField(),           cc.xyw(3,  7, 7));
        
        return builder.getPanel();
    }
    
    /**
     * Builds and answer the editor"s transport tab for the given layout.
     * 
     * @param layout   the layout to be used
     * @return the editor"s transport panel
     */
    private JComponent buildEditorTransportPanel(FormLayout layout) {
        layout.setColumnGroups(new int[][] { { 3, 5, 7, 9 } });
        PanelBuilder builder = new PanelBuilder(layout);
            
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.addLabel("Shipper:",            cc.xy (1, 1));
        builder.add(new JTextField(),           cc.xy (3, 1));
        builder.add(new JTextField(),           cc.xyw(5, 1, 5));
        builder.addLabel("Consignee:",          cc.xy (1, 3));
        builder.add(new JTextField(),           cc.xy (3, 3));
        builder.add(new JTextField(),           cc.xyw(5, 3, 5));
        builder.addLabel("Departure:",          cc.xy (1, 5));
        builder.add(new JTextField(),           cc.xy (3, 5));
        builder.add(new JTextField(),           cc.xyw(5, 5, 5));
        builder.addLabel("Destination:",        cc.xy (1, 7));
        builder.add(new JTextField(),           cc.xy (3, 7));
        builder.add(new JTextField(),           cc.xyw(5, 7, 5));
        
        return builder.getPanel();
    }
    
    
    
    
}





Demonstrates the different FormLayout alignments

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */
import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the different FormLayout alignments.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 */
public class AlignmentExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Alignments");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new AlignmentExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Horizontal", buildHorizontalButtons());
        tabbedPane.add("Vertical",   buildVerticalButtons());
        return tabbedPane;
    }
    
    
    private JComponent buildHorizontalButtons() {
        FormLayout layout = new FormLayout(
            "left:pref, 15px, center:pref, 15px, right:pref, 15px, fill:pref, 15px, pref",   
            "pref, 12px, pref, 4px, pref, 4px, pref, 4px, pref, 4px, pref"); 
            
        // Create a panel that uses the layout.
        JPanel panel = new JPanel(layout);
        // Set a default border.
        panel.setBorder(Borders.DIALOG_BORDER);
        
        // Create a reusable CellConstraints instance.
        CellConstraints cc = new CellConstraints();
        // Add components to the panel.
        panel.add(new JLabel("Left"),     cc.xy(1,  1));
        panel.add(new JButton("Name"),    cc.xy(1,  3));
        panel.add(new JButton("Phone"),   cc.xy(1,  5));
        panel.add(new JButton("Fax"),     cc.xy(1,  7));
        panel.add(new JButton("Email"),   cc.xy(1,  9));
        panel.add(new JButton("Address"), cc.xy(1, 11));
        panel.add(new JLabel("Center"),   cc.xy(3,  1));
        panel.add(new JButton("Name"),    cc.xy(3,  3));
        panel.add(new JButton("Phone"),   cc.xy(3,  5));
        panel.add(new JButton("Fax"),     cc.xy(3,  7));
        panel.add(new JButton("Email"),   cc.xy(3,  9));
        panel.add(new JButton("Address"), cc.xy(3, 11));
        panel.add(new JLabel("Right"),    cc.xy(5,  1));
        panel.add(new JButton("Name"),    cc.xy(5,  3));
        panel.add(new JButton("Phone"),   cc.xy(5,  5));
        panel.add(new JButton("Fax"),     cc.xy(5,  7));
        panel.add(new JButton("Email"),   cc.xy(5,  9));
        panel.add(new JButton("Address"), cc.xy(5, 11));
        panel.add(new JLabel("Fill"),     cc.xy(7,  1, "center, center"));
        panel.add(new JButton("Name"),    cc.xy(7,  3));
        panel.add(new JButton("Phone"),   cc.xy(7,  5));
        panel.add(new JButton("Fax"),     cc.xy(7,  7));
        panel.add(new JButton("Email"),   cc.xy(7,  9));
        panel.add(new JButton("Address"), cc.xy(7, 11));
        panel.add(new JLabel("Default"),  cc.xy(9,  1, "center, center"));
        panel.add(new JButton("Name"),    cc.xy(9,  3));
        panel.add(new JButton("Phone"),   cc.xy(9,  5));
        panel.add(new JButton("Fax"),     cc.xy(9,  7));
        panel.add(new JButton("Email"),   cc.xy(9,  9));
        panel.add(new JButton("Address"), cc.xy(9, 11));
        return panel;
    }
    
    
    private JComponent buildVerticalButtons() {
        FormLayout layout = new FormLayout(
            "pref, 8dlu, pref, 4dlu, pref",   
            "top:pref, 9dlu, center:pref, 9dlu, bottom:pref, 9dlu, fill:pref, 9dlu, pref"); 
            
        // Create a panel that uses the layout.
        JPanel panel = new JPanel(layout);
        // Set a default border.
        panel.setBorder(Borders.DIALOG_BORDER);
        
        // Create a reusable CellConstraints instance.
        CellConstraints cc = new CellConstraints();
        // Add components to the panel.
        panel.add(new JLabel("Top"),      cc.xy(1,  1));
        panel.add(createSmallButton(),    cc.xy(3,  1));
        panel.add(createMediumButton(),   cc.xy(5,  1));
        panel.add(new JLabel("Center"),   cc.xy(1,  3));
        panel.add(createSmallButton(),    cc.xy(3,  3));
        panel.add(createMediumButton(),   cc.xy(5,  3));
        panel.add(new JLabel("Bottom"),   cc.xy(1,  5));
        panel.add(createSmallButton(),    cc.xy(3,  5));
        panel.add(createMediumButton(),   cc.xy(5,  5));
        panel.add(new JLabel("Fill"),     cc.xy(1,  7));
        panel.add(createSmallButton(),    cc.xy(3,  7));
        panel.add(createMediumButton(),   cc.xy(5,  7));
        panel.add(new JLabel("Default"),  cc.xy(1,  9));
        panel.add(createSmallButton(),    cc.xy(3,  9));
        panel.add(createMediumButton(),   cc.xy(5,  9));
        return panel;
    }
    
    private JButton createSmallButton() {
        return new JButton("<html>One</html>");
    }
    
    private JButton createMediumButton() {
        return new JButton("<html>One<br>Two</html>");
    }
    
    
}





FormLayout: Basic Example 1

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import javax.swing.*;
public class FormLayoutExample1 extends JPanel {
    public FormLayoutExample1() {
        FormLayout formLayout = new FormLayout("pref", "pref, pref");
        setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        add(new JLabel("Component 1"), c.xy(1, 1));
        add(new JLabel("Component 2"), c.xy(1, 2));
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Basic Example 1");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample1());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Bounds Example 6

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class FormLayoutExample6 extends JPanel {
    public FormLayoutExample6() {
      super(new BorderLayout());
  
        JTabbedPane tabbedPane = new JTabbedPane();
        String labelWidth = "50dlu";
        FormLayout formLayout = new FormLayout("max(" + labelWidth + ";pref), 2dlu, 100dlu", "default, default, default");
        JPanel tabPanel1 = new FormDebugPanel();
        tabPanel1.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        tabPanel1.add(createLabel("Small 1"), c.xy(1, 1));
        tabPanel1.add(createLabel("Larger Label"), c.xy(1, 2));
        tabPanel1.add(createLabel("Med. Label"), c.xy(1, 3));
        tabPanel1.add(new JTextField(), c.xy(3, 1));
        tabPanel1.add(new JTextField(), c.xy(3, 2));
        tabPanel1.add(new JTextField(), c.xy(3, 3));
        tabbedPane.add("Tab1", tabPanel1);
        formLayout = new FormLayout("max(" + labelWidth + ";pref), 2dlu, 100dlu", "default, default, default");
        JPanel tabPanel2 = new FormDebugPanel();
        tabPanel2.setLayout(formLayout);
        tabPanel2.add(createLabel("Small 2"), c.xy(1, 1));
        tabPanel2.add(createLabel("Small 3"), c.xy(1, 2));
        tabPanel2.add(createLabel("Small 4"), c.xy(1, 3));
        tabPanel2.add(new JTextField(), c.xy(3, 1));
        tabPanel2.add(new JTextField(), c.xy(3, 2));
        tabPanel2.add(new JTextField(), c.xy(3, 3));
        tabbedPane.add("Tab2", tabPanel2);
        formLayout = new FormLayout("pref, 2dlu, 100dlu", "default, default, default");
        JPanel tabPanel3 = new FormDebugPanel();
        tabPanel3.setLayout(formLayout);
        tabPanel3.add(createLabel("Small 5"), c.xy(1, 1));
        tabPanel3.add(createLabel("Small 6"), c.xy(1, 2));
        tabPanel3.add(createLabel("Small 7"), c.xy(1, 3));
        tabPanel3.add(new JTextField(), c.xy(3, 1));
        tabPanel3.add(new JTextField(), c.xy(3, 2));
        tabPanel3.add(new JTextField(), c.xy(3, 3));
        tabbedPane.add("Tab3", tabPanel3);
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(tabbedPane, BorderLayout.CENTER);
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Bounds Example 6");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample7());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Button Bar Builder Example

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
public class ButtonBarBuilderExample1 extends JPanel {
    public ButtonBarBuilderExample1() {
      super(new BorderLayout());
        ButtonBarBuilder builder = new ButtonBarBuilder(new FormDebugPanel());
        builder.addGridded(new JButton("Help"));
        builder.addRelatedGap();
        builder.addGlue();
        builder.addGriddedButtons(new JButton[]{new JButton("Ok"), new JButton("Cancel"), new JButton("Apply")});
        add(builder.getPanel());
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Button Bar Builder Example");
      f.setDefaultCloseOperation(2);
      f.add(new ButtonBarBuilderExample1());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Button Bar Builder Example 2

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
public class ButtonBarBuilderExample2 extends JPanel {
    public ButtonBarBuilderExample2() {
      super(new BorderLayout());
        ButtonBarBuilder builder = new ButtonBarBuilder(new FormDebugPanel());
        builder.setLeftToRightButtonOrder(true);
        builder.addGridded(new JButton("Help"));
        builder.addRelatedGap();
        builder.addGlue();
        builder.addGriddedButtons(new JButton[]{new JButton("Ok"), new JButton("Cancel"), new JButton("Apply")});
        add(builder.getPanel());
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Button Bar Builder Example 2");
      f.setDefaultCloseOperation(2);
      f.add(new ButtonBarBuilderExample2());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Button Bar Builder Example 3

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.ButtonBarBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
public class ButtonBarBuilderExample3 extends JPanel {
    public ButtonBarBuilderExample3() {
      super(new BorderLayout());
        ButtonBarBuilder builder = new ButtonBarBuilder(new FormDebugPanel());
        builder.addGridded(new JButton("Help"));
        builder.addRelatedGap();
        builder.addGlue();
        builder.addFixed(new JButton("Ok"));
        builder.addFixed(new JButton("Cancel"));
        builder.addFixed(new JButton("Apply"));
        add(builder.getPanel());
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Button Bar Builder Example 3");
      f.setDefaultCloseOperation(2);
      f.add(new ButtonBarBuilderExample3());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Button Stack Builder Example 1

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.ButtonStackBuilder;
import com.jgoodies.forms.debug.FormDebugPanel;
public class ButtonStackBuilderExample1 extends JPanel {
    public ButtonStackBuilderExample1() {
      super(new BorderLayout());
        ButtonStackBuilder builder = new ButtonStackBuilder(new FormDebugPanel());
        builder.addGridded(new JButton("Button1"));
        builder.addGridded(new JButton("Button2"));
        JButton bigGriddedButton = new JButton("Button3");
        bigGriddedButton.setFont(bigGriddedButton.getFont().deriveFont(30.0f));
        builder.addGridded(bigGriddedButton);
        builder.addUnrelatedGap();
        builder.addFixed(new JButton("Button4"));
        JButton bigFixedButton = new JButton("Button5");
        bigFixedButton.setFont(bigFixedButton.getFont().deriveFont(24.0f));
        builder.addFixed(bigFixedButton);
        builder.addUnrelatedGap();
        builder.addButtons(new JButton[]{new JButton("Button6"), new JButton("Button7")});
        add(builder.getPanel());
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Button Stack Builder Example 1");
      f.setDefaultCloseOperation(2);
      f.add(new ButtonStackBuilderExample1());
      f.pack();
      f.setVisible(true);
    }
    
}





FormLayout: Default Alignment Example 2

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import javax.swing.*;
public class FormLayoutExample2 extends JPanel {
    public FormLayoutExample2() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("left:100px, right:100px, center:100px, fill:100px", "top:100px, bottom:100px, center:100px, fill:100px");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("L/T", 50, 50), c.xy(1, 1));
        panel.add(createLabel("L/B", 50, 50), c.xy(1, 2));
        panel.add(createLabel("L/C", 50, 50), c.xy(1, 3));
        panel.add(createLabel("L/F", 50, 50), c.xy(1, 4));
        panel.add(createLabel("R/T", 50, 50), c.xy(2, 1));
        panel.add(createLabel("R/B", 50, 50), c.xy(2, 2));
        panel.add(createLabel("R/C", 50, 50), c.xy(2, 3));
        panel.add(createLabel("R/F", 50, 50), c.xy(2, 4));
        panel.add(createLabel("C/T", 50, 50), c.xy(3, 1));
        panel.add(createLabel("C/B", 50, 50), c.xy(3, 2));
        panel.add(createLabel("C/C", 50, 50), c.xy(3, 3));
        panel.add(createLabel("C/F", 50, 50), c.xy(3, 4));
        panel.add(createLabel("F/T", 50, 50), c.xy(4, 1));
        panel.add(createLabel("F/B", 50, 50), c.xy(4, 2));
        panel.add(createLabel("F/C", 50, 50), c.xy(4, 3));
        panel.add(createLabel("F/F", 50, 50), c.xy(4, 4));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Default Alignment Example 2");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample2());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Default Form Builder Example 1

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
public class DefaultFormBuilderExample1 extends JPanel {
    public DefaultFormBuilderExample1() {
      super(new BorderLayout());
  
        DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout(""));
        builder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        builder.appendColumn("right:pref");
        builder.appendColumn("3dlu");
        builder.appendColumn("fill:max(pref; 100px)");
        builder.appendColumn("5dlu");
        builder.appendColumn("right:pref");
        builder.appendColumn("3dlu");
        builder.appendColumn("fill:max(pref; 100px)");
        builder.append("First:", new JTextField());
        builder.append("Last:", new JTextField());
        builder.nextLine();
        builder.append("Married:", new JCheckBox());
        builder.nextLine();
        builder.append("Phone:", new JTextField());
        builder.nextLine();
        builder.append("Fax:", new JTextField());
        builder.nextLine();
        builder.append("Email:", new JTextField());
        builder.nextLine();
        builder.appendSeparator("Work");
        builder.append("Company:", new JTextField());
        builder.nextLine();
        builder.append("Phone:", new JTextField());
        builder.nextLine();
        builder.append("Fax:", new JTextField());
        builder.nextLine();
        add(builder.getPanel());
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Default Form Builder Example 1");
      f.setDefaultCloseOperation(2);
      f.add(new DefaultFormBuilderExample1());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Explicit Alignment Example 3

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import javax.swing.*;
public class FormLayoutExample3 extends JPanel {
    public FormLayoutExample3() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("100px, 100px, 100px, 100px", "100px, 100px, 100px, 100px");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("L/T", 50, 50), c.xy(1, 1, CellConstraints.LEFT, CellConstraints.TOP));
        panel.add(createLabel("L/B", 50, 50), c.xy(1, 2, CellConstraints.LEFT, CellConstraints.BOTTOM));
        panel.add(createLabel("L/C", 50, 50), c.xy(1, 3, CellConstraints.LEFT, CellConstraints.CENTER));
        panel.add(createLabel("L/F", 50, 50), c.xy(1, 4, CellConstraints.LEFT, CellConstraints.FILL));
        panel.add(createLabel("R/T", 50, 50), c.xy(2, 1, CellConstraints.RIGHT, CellConstraints.TOP));
        panel.add(createLabel("R/B", 50, 50), c.xy(2, 2, CellConstraints.RIGHT, CellConstraints.BOTTOM));
        panel.add(createLabel("R/C", 50, 50), c.xy(2, 3, CellConstraints.RIGHT, CellConstraints.CENTER));
        panel.add(createLabel("R/F", 50, 50), c.xy(2, 4, CellConstraints.RIGHT, CellConstraints.FILL));
        panel.add(createLabel("C/T", 50, 50), c.xy(3, 1, CellConstraints.CENTER, CellConstraints.TOP));
        panel.add(createLabel("C/B", 50, 50), c.xy(3, 2, CellConstraints.CENTER, CellConstraints.BOTTOM));
        panel.add(createLabel("C/C", 50, 50), c.xy(3, 3, CellConstraints.CENTER, CellConstraints.CENTER));
        panel.add(createLabel("C/F", 50, 50), c.xy(3, 4, CellConstraints.CENTER, CellConstraints.FILL));
        panel.add(createLabel("F/T", 50, 50), c.xy(4, 1, CellConstraints.FILL, CellConstraints.TOP));
        panel.add(createLabel("F/B", 50, 50), c.xy(4, 2, CellConstraints.FILL, CellConstraints.BOTTOM));
        panel.add(createLabel("F/C", 50, 50), c.xy(4, 3, CellConstraints.FILL, CellConstraints.CENTER));
        panel.add(createLabel("F/F", 50, 50), c.xy(4, 4, CellConstraints.FILL, CellConstraints.FILL));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Explicit Alignment Example 3");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample3());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Grouping Example 10

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class FormLayoutExample10 extends JPanel {
    public FormLayoutExample10() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("p, p, p, p", "p, p");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("C1:", 30, 30), c.xy(1, 1));
        panel.add(createLabel("C2:", 30, 40), c.xy(2, 1));
        panel.add(createLabel("C3:", 30, 50), c.xy(3, 1));
        panel.add(createLabel("C4:", 30, 60), c.xy(4, 1));
        panel.add(createLabel("C5:", 30, 30), c.xy(1, 2));
        panel.add(createLabel("C6:", 40, 30), c.xy(2, 2));
        panel.add(createLabel("C7:", 50, 30), c.xy(3, 2));
        panel.add(createLabel("C8:", 60, 30), c.xy(4, 2));
        formLayout.setRowGroups(new int[][]{{1, 2}});
        formLayout.setColumnGroups(new int[][]{{1, 3}});
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Grouping Example 10");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample10());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Growable Example 8

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class FormLayoutExample8 extends JPanel {
    public FormLayoutExample8() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("fill:50px:grow(.25), fill:50px:grow, fill:50px:grow(.25)", "fill:50px");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("Comp1"), c.xy(1, 1));
        panel.add(createLabel("Comp2"), c.xy(2, 1));
        panel.add(createLabel("Comp3"), c.xy(3, 1));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Growable Example 8");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample8());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout growing options: none, default, weighted

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the FormLayout growing options: none, default, weighted.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 */
public class GrowingExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Growing");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new GrowingExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("All",        buildHorizontalAllExtraSpacePanel());
        tabbedPane.add("Half",       buildHorizontalHalfAndHalfPanel());
        tabbedPane.add("Percent",    buildHorizontalPercentMixedPanel());
        tabbedPane.add("Percent 2",  buildHorizontalPercentPanel());
        tabbedPane.add("Vertical 1", buildVerticalGrowing1Panel());
        tabbedPane.add("Vertical 2", buildVerticalGrowing2Panel());
        return tabbedPane;
    }
    
    
    private JComponent buildHorizontalAllExtraSpacePanel() {
        FormLayout layout = new FormLayout(
            "pref, 6px, pref:grow",   
            "pref, 12px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Fixed"),  cc.xy(1, 1));
        panel.add(new JLabel("Gets all extra space"),  cc.xy(3, 1));
        
        panel.add(new JTextField(5),   cc.xy(1, 3));
        panel.add(new JTextField(5),   cc.xy(3, 3));
        return panel;
    }
    
    
    private JComponent buildHorizontalHalfAndHalfPanel() {
        FormLayout layout = new FormLayout(
            "pref, 6px, 0:grow, 6px, 0:grow",   
            "pref, 12px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Fixed"),  cc.xy(1, 1));
        panel.add(new JLabel("Gets half of extra space"),  cc.xy(3, 1));
        panel.add(new JLabel("gets half of extra space"),  cc.xy(5, 1));
        
        panel.add(new JTextField(5),   cc.xy(1, 3));
        panel.add(new JTextField(5),   cc.xy(3, 3));
        panel.add(new JTextField(5),   cc.xy(5, 3));
        return panel;
    }
    
    
    private JComponent buildHorizontalPercentMixedPanel() {
        FormLayout layout = new FormLayout(
            "pref, 6px, 0:grow(0.25), 6px, 0:grow(0.75)",   
            "pref, 12px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Fixed"),       cc.xy(1, 1));
        panel.add(new JLabel("Gets 25% of extra space"),  cc.xy(3, 1));
        panel.add(new JLabel("Gets 75% of extra space"),  cc.xy(5, 1));
        
        panel.add(new JTextField(5),        cc.xy(1, 3));
        panel.add(new JTextField(5),        cc.xy(3, 3));
        panel.add(new JTextField(5),        cc.xy(5, 3));
        return panel;
    }
    
    
    private JComponent buildHorizontalPercentPanel() {
        FormLayout layout = new FormLayout(
            "pref:grow(0.33), 6px, pref:grow(0.67)",   
            "pref, 12px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Gets 33% of the space"),    cc.xy(1, 1));
        panel.add(new JLabel("Gets 67% of the space"),    cc.xy(3, 1));
        
        panel.add(new JTextField(5),   cc.xy(1, 3));
        panel.add(new JTextField(5),   cc.xy(3, 3));
        return panel;
    }
    
    private JComponent buildVerticalGrowing1Panel() {
        FormLayout layout = new FormLayout(
            "pref, 12px, pref",   
            "pref, 6px, fill:0:grow(0.25), 6px, fill:0:grow(0.75)"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Fixed"),                   cc.xy(1, 1));
        panel.add(new JLabel("Gets 25% of extra space"), cc.xy(1, 3));
        panel.add(new JLabel("Gets 75% of extra space"), cc.xy(1, 5));
        
        panel.add(createTextArea(4, 30), cc.xy(3, 1));
        panel.add(createTextArea(4, 30), cc.xy(3, 3));
        panel.add(createTextArea(4, 30), cc.xy(3, 5));
        return panel;
    }
    
    private JComponent buildVerticalGrowing2Panel() {
        FormLayout layout = new FormLayout(
            "pref, 12px, pref",   
            "fill:0:grow(0.25), 6px, fill:0:grow(0.75)"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Gets 25% of extra space"), cc.xy(1, 1));
        panel.add(new JLabel("Gets 75% of extra space"), cc.xy(1, 3));
        
        panel.add(createTextArea(4, 30), cc.xy(3, 1));
        panel.add(createTextArea(4, 30), cc.xy(3, 3));
        return panel;
    }
    
    
    // Component Creation *****************************************************
    
    private JComponent createTextArea(int rows, int cols) {
        return new JScrollPane(new JTextArea(rows, cols),
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    }
    
    
}





FormLayout: No Grouping Example 9

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class FormLayoutExample9 extends JPanel {
    public FormLayoutExample9() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("p, p, p, p", "p, p");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("C1:", 30, 30), c.xy(1, 1));
        panel.add(createLabel("C2:", 30, 40), c.xy(2, 1));
        panel.add(createLabel("C3:", 30, 50), c.xy(3, 1));
        panel.add(createLabel("C4:", 30, 60), c.xy(4, 1));
        panel.add(createLabel("C5:", 30, 30), c.xy(1, 2));
        panel.add(createLabel("C6:", 40, 30), c.xy(2, 2));
        panel.add(createLabel("C7:", 50, 30), c.xy(3, 2));
        panel.add(createLabel("C8:", 60, 30), c.xy(4, 2));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: No Grouping Example 9");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample9());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Size Specification Example 4

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import javax.swing.*;
public class FormLayoutExample4 extends JPanel {
    public FormLayoutExample4() {
      super(new BorderLayout());
        JPanel panel = new FormDebugPanel();
        FormLayout formLayout = new FormLayout("35px, 40pt, 35dlu, 1.0in, 3.5cm, 40.0mm", "min, min, min, min, min, min");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("30px"), c.xy(1, 1));
        panel.add(createLabel("40pt"), c.xy(2, 2));
        panel.add(createLabel("35dlu"), c.xy(3, 3));
        panel.add(createLabel("1.0in"), c.xy(4, 4));
        panel.add(createLabel("3.5cm"), c.xy(5, 5));
        panel.add(createLabel("40.0mm"), c.xy(6, 6));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Size Specification Example 4");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample4());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Spacing Example 5

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import javax.swing.*;
public class FormLayoutExample5 extends JPanel {
    public FormLayoutExample5() {
      super(new BorderLayout());
  
        JPanel panel = new FormDebugPanel();
        FormLayout formLayout = new FormLayout("pref, 10dlu, 100dlu", "default, default, default");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("Small 1"), c.xy(1, 1));
        panel.add(createLabel("Larger Label"), c.xy(1, 2));
        panel.add(createLabel("Med. Label"), c.xy(1, 3));
        panel.add(new JTextField(), c.xy(3, 1));
        panel.add(new JTextField(), c.xy(3, 2));
        panel.add(new JTextField(), c.xy(3, 3));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Spacing Example 5");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample5());
      f.pack();
      f.setVisible(true);
    }
}





FormLayout: Spanning Example 7

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.debug.FormDebugPanel;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class FormLayoutExample7 extends JPanel {
    public FormLayoutExample7() {
      super(new BorderLayout());
        FormDebugPanel panel = new FormDebugPanel();
        FormLayout formLayout =
                new FormLayout("fill:100px, fill:100px, fill:100px", "fill:100px, fill:100px");
        panel.setLayout(formLayout);
        CellConstraints c = new CellConstraints();
        panel.add(createLabel("Comp1"), c.xywh(1, 1, 1, 2));
        panel.add(createLabel("Comp2"), c.xywh(2, 1, 2, 1));
        panel.add(createLabel("Comp3"), c.xy(2, 2));
        panel.add(createLabel("Comp4"), c.xy(3, 2));
        add(panel);
    }
    public JLabel createLabel(String text, int prefWidth, int prefHeight) {
        JLabel label = createLabel(text);
        label.setPreferredSize(new Dimension(prefWidth, prefHeight));
        return label;
    }
    public JLabel createLabel(String text) {
        JLabel label = new JLabel(text);
        label.setBackground(Color.lightGray);
        label.setBorder(BorderFactory.createLineBorder(Color.black));
        label.setOpaque(true);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        return label;
    }

    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Spanning Example 7");
      f.setDefaultCloseOperation(2);
      f.add(new FormLayoutExample7());
      f.pack();
      f.setVisible(true);
    }
}





How columns and rows can be grouped in FormLayout

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how columns and rows can be grouped in FormLayout.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.10 $
 */
public class GroupingExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Grouping");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new GroupingExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Ungrouped Bar",   buildWizardBar(false));
        tabbedPane.add("Grouped Bar",     buildWizardBar(true));
        tabbedPane.add("Ungrouped Rows",  buildEditorPanel(false));
        tabbedPane.add("Grouped Rows",    buildEditorPanel(true));
        return tabbedPane;
    }
    
    
    private JComponent buildWizardBar(boolean grouped) {
        FormLayout layout = new FormLayout(
            "pref, 6px:grow, pref, pref, 12px, pref, 6px, pref",   
            "pref");
        if (grouped) { 
            layout.setColumnGroups(new int[][]{{1, 3, 4, 6, 8}});
        }
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(createNarrowButton("Hilfe"),      cc.xy(1, 1));
        panel.add(createNarrowButton("< Zur\u00FCck"),   cc.xy(3, 1));
        panel.add(createNarrowButton("Vor >"),      cc.xy(4, 1));
        panel.add(createNarrowButton("Beenden"),    cc.xy(6, 1));
        panel.add(createNarrowButton("Abbrechen"),  cc.xy(8, 1));
        
        return panel;
    }
    
    
    private JComponent buildEditorPanel(boolean grouped) {
        FormLayout layout = new FormLayout(
                "pref, 4dlu, 35dlu, 2dlu, 35dlu, 2dlu, 35dlu, 2dlu, 35dlu",
                "p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p, 2dlu, p");
        if (grouped) {
            layout.setRowGroups(new int[][] { { 1, 3, 5, 7, 9, 11, 13, 15, 17 } });
        }  
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("File number:"),       cc.xy (1,  1));
        panel.add(new JTextField(),                 cc.xyw(3,  1, 7));
        panel.add(new JLabel("BL/MBL number:"),     cc.xy (1,  3));
        panel.add(new JTextField(),                 cc.xy (3,  3));
        panel.add(new JTextField(),                 cc.xy (5,  3));
        panel.add(new JLabel("Entry date:"),        cc.xy (1,  5));
        panel.add(new JTextField(),                 cc.xy (3,  5));
        panel.add(new JLabel("RFQ number:"),        cc.xy (1,  7));
        panel.add(new JTextField(),                 cc.xyw(3,  7, 7));
        panel.add(new JLabel("Goods:"),             cc.xy (1,  9));
        panel.add(new JCheckBox("Dangerous"),       cc.xyw(3,  9, 7));
        panel.add(new JLabel("Shipper:"),           cc.xy (1, 11));
        panel.add(new JTextField(),                 cc.xyw(3, 11, 7));
        panel.add(new JLabel("Customer:"),          cc.xy (1, 13));
        panel.add(new JTextField(),                 cc.xyw(3, 13, 5));
        panel.add(new JButton("..."),               cc.xy (9, 13));
        panel.add(new JLabel("Port of loading:"),   cc.xy (1, 15));
        panel.add(new JTextField(),                 cc.xyw(3, 15, 7));
        panel.add(new JLabel("Destination:"),       cc.xy (1, 17));
        panel.add(new JTextField(),                 cc.xyw(3, 17, 7));
        
        return panel;
    }
    
    
    // Component Creation *****************************************************
    
    private JButton createNarrowButton(String text) {
        JButton button = new JButton(text);
        button.putClientProperty("jgoodies.isNarrow", Boolean.TRUE);
        return button;
    }
    
    
}





How components can span multiple columns and rows

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how components can span multiple columns and rows.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.12 $
 */
public class SpanExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Span");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new SpanExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    /**
     * Builds and returns a tabbed pane with tabs for the column span example
     * and the row span example.
     * 
     * @return a tabbed pane that shows horizontal and vertical spans 
     */
    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Column Span", buildColumnSpanExample());
        tabbedPane.add("Row Span",    buildRowSpanExample());
        return tabbedPane;
    }
    
    
    /**
     * Builds and returns a panel where a component spans multiple columns.
     * 
     * @return a panel with a component that spans multiple columns
     */
    private JComponent buildColumnSpanExample() {
        FormLayout layout = new FormLayout(
            "pref, 8px, 100px, 4px, 200px",   
            "pref, 6px, pref, 6px, pref, 6px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("Name:"),     cc.xy (1, 1));
        panel.add(new JTextField(),        cc.xyw(3, 1, 3));
        
        panel.add(new JLabel("Phone:"),    cc.xy (1, 3));
        panel.add(new JTextField(),        cc.xyw(3, 3, 3));
        
        panel.add(new JLabel("ZIP/City:"), cc.xy (1, 5));
        panel.add(new JTextField(),        cc.xy (3, 5));
        panel.add(new JTextField(),        cc.xy (5, 5));
        
        panel.add(new JLabel("Country:"),  cc.xy (1, 7));
        panel.add(new JTextField(),        cc.xyw(3, 7, 3));
        
        return panel;
    }
    
    
    /**
     * Builds and returns a panel where a component spans multiple rows.<p>
     * 
     * This demo method is about layout. The default FocusTraversalPolicy
     * will lead to a poor focus traversal order: name, notes, phone, fax;
     * where the order should be: name, phone, fax, notes.
     * The components are added in the same order as they shall be
     * traversed by the focus. 
     * Hence, if you set a ContainerOrderFocusTraversalPolicy,
     * the focus will traverse the fields in the appropriate order.
     * 
     * @return a panel with a component that spans multiple rows
     */
    private JComponent buildRowSpanExample() {
        FormLayout layout = new FormLayout(
            "200px, 25px, 200px",   
            "pref, 2px, pref, 9px, " +
            "pref, 2px, pref, 9px, " +
            "pref, 2px, pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        Component addressArea = new JScrollPane(new JTextArea());
        panel.add(new JLabel("Name"),     cc.xy  (1,  1));
        panel.add(new JTextField(),       cc.xy  (1,  3));
        
        panel.add(new JLabel("Phone"),    cc.xy  (1,  5));
        panel.add(new JTextField(),       cc.xy  (1,  7));
        
        panel.add(new JLabel("Fax"),      cc.xy  (1,  9));
        panel.add(new JTextField(),       cc.xy  (1, 11));
        
        panel.add(new JLabel("Notes"),    cc.xy  (3, 1));
        panel.add(addressArea,            cc.xywh(3, 3, 1, 9));
        
        return panel;
    }
    
    
}





How FormLayout applies the default column and

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates how FormLayout applies the default column and row
 * alignments to cells, and how to override the defaults.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 */
public class CellAlignmentExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Cell Alignments");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new CellAlignmentExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add(buildHorizontalPanel(), "Horizontal");
        tabbedPane.add(buildVerticalPanel(),   "Vertical");
        return tabbedPane;
    }
    
    
    private JComponent buildHorizontalPanel() {
        FormLayout layout = new FormLayout(
                        "r:p, 4dlu, left:pref:g, center:pref:g, right:pref:g, pref:g",
                        "pref, 8dlu, pref, pref, pref, pref, pref");
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        
        panel.add(new JLabel("Column Spec: "),          "1, 1, r, c");
        panel.add(new JLabel(" \"left:pref:grow\" "),   "3, 1, c, c");
        panel.add(new JLabel(" \"center:pref:grow\" "), "4, 1, c, c");
        panel.add(new JLabel(" \"right:pref:grow\" "),  "5, 1, c, c");
        panel.add(new JLabel(" \"pref:grow\" "),        "6, 1, c, c");
        
        int row = 3;
        addHorizontalButton(panel, 3, row, CellConstraints.DEFAULT);
        addHorizontalButton(panel, 4, row, CellConstraints.DEFAULT);
        addHorizontalButton(panel, 5, row, CellConstraints.DEFAULT);
        addHorizontalButton(panel, 6, row, CellConstraints.DEFAULT);
        row++;
        addHorizontalButton(panel, 3, row, CellConstraints.FILL);
        addHorizontalButton(panel, 4, row, CellConstraints.FILL);
        addHorizontalButton(panel, 5, row, CellConstraints.FILL);
        addHorizontalButton(panel, 6, row, CellConstraints.FILL);
        row++;
        addHorizontalButton(panel, 3, row, CellConstraints.LEFT);
        addHorizontalButton(panel, 4, row, CellConstraints.LEFT);
        addHorizontalButton(panel, 5, row, CellConstraints.LEFT);
        addHorizontalButton(panel, 6, row, CellConstraints.LEFT);
        row++;
        addHorizontalButton(panel, 3, row, CellConstraints.CENTER);
        addHorizontalButton(panel, 4, row, CellConstraints.CENTER);
        addHorizontalButton(panel, 5, row, CellConstraints.CENTER);
        addHorizontalButton(panel, 6, row, CellConstraints.CENTER);
        row++;
        addHorizontalButton(panel, 3, row, CellConstraints.RIGHT);
        addHorizontalButton(panel, 4, row, CellConstraints.RIGHT);
        addHorizontalButton(panel, 5, row, CellConstraints.RIGHT);
        addHorizontalButton(panel, 6, row, CellConstraints.RIGHT);
        return panel;
    }
    
    
    private JComponent buildVerticalPanel() {
        FormLayout layout = new FormLayout(
                        "left:pref, 8dlu, p, c:p, p, p, p",
                        "p, 4dlu, top:pref:g, center:pref:g, bottom:pref:g, pref:g");
        layout.setColumnGroups(new int[][] {{3, 5, 6, 7}});
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        panel.add(new JLabel("Row Spec:"),             "1, 1, r, c");
        panel.add(new JLabel("\"top:pref:grow\""),     "1, 3, r, c");
        panel.add(new JLabel("\"center:pref:grow\""), "1, 4, r, c");
        panel.add(new JLabel("\"bottom:pref:grow\""),  "1, 5, r, c");
        panel.add(new JLabel("\"pref:grow\""),         "1, 6, r, c");
        
        int col = 3;
        addVerticalButton(panel, col, 3, CellConstraints.DEFAULT);
        addVerticalButton(panel, col, 4, CellConstraints.DEFAULT);
        addVerticalButton(panel, col, 5, CellConstraints.DEFAULT);
        addVerticalButton(panel, col, 6, CellConstraints.DEFAULT);
        col++;
        addVerticalButton(panel, col, 3, CellConstraints.FILL);
        addVerticalButton(panel, col, 4, CellConstraints.FILL);
        addVerticalButton(panel, col, 5, CellConstraints.FILL);
        addVerticalButton(panel, col, 6, CellConstraints.FILL);
        col++;
        addVerticalButton(panel, col, 3, CellConstraints.TOP);
        addVerticalButton(panel, col, 4, CellConstraints.TOP);
        addVerticalButton(panel, col, 5, CellConstraints.TOP);
        addVerticalButton(panel, col, 6, CellConstraints.TOP);
        col++;
        addVerticalButton(panel, col, 3, CellConstraints.CENTER);
        addVerticalButton(panel, col, 4, CellConstraints.CENTER);
        addVerticalButton(panel, col, 5, CellConstraints.CENTER);
        addVerticalButton(panel, col, 6, CellConstraints.CENTER);
        col++;
        addVerticalButton(panel, col, 3, CellConstraints.BOTTOM);
        addVerticalButton(panel, col, 4, CellConstraints.BOTTOM);
        addVerticalButton(panel, col, 5, CellConstraints.BOTTOM);
        addVerticalButton(panel, col, 6, CellConstraints.BOTTOM);
        return panel;
    }
    
    
    private void addHorizontalButton(JPanel panel, int col, int row, 
                                    CellConstraints.Alignment hAlignment) {
        JButton button = new JButton(hAlignment.toString());
        panel.add(button, new CellConstraints(col, row, 
                                              hAlignment, 
                                              CellConstraints.DEFAULT));
    }
    
    
    private void addVerticalButton(JPanel panel, int col, int row, 
                                    CellConstraints.Alignment vAlignment) {
        JButton button = new JButton(vAlignment.toString());
        panel.add(button, new CellConstraints(col, row, 
                                              CellConstraints.DEFAULT,
                                              vAlignment));
    }
    
    
}





Panel Builder Example 1

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
public class PanelBuilderExample1 extends JPanel {
    public PanelBuilderExample1() {
      super(new BorderLayout());
        PanelBuilder builder = new PanelBuilder(new FormLayout(""));
        builder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        builder.appendColumn("right:pref");
        builder.appendColumn("fill:max(pref; 100px)");
        CellConstraints c = new CellConstraints();
        builder.appendRow("top:pref");
        builder.addLabel("First:", c.xy(1, 1));
        builder.add(new JTextField(), c.xy(2, 1));
        builder.appendRow("top:pref");
        builder.addLabel("Last:", c.xy(1, 2));
        builder.add(new JTextField(), c.xy(2, 2));
        builder.appendRow("top:pref");
        builder.addLabel("Married:", c.xy(1, 3));
        builder.add(new JCheckBox(), c.xy(2, 3));
        builder.appendRow("top:pref");
        builder.addLabel("Phone:", c.xy(1, 4));
        builder.add(new JTextField(), c.xy(2, 4));
        builder.appendRow("top:pref");
        builder.addLabel("Fax:", c.xy(1, 5));
        builder.add(new JTextField(), c.xy(2, 5));
        builder.appendRow("top:pref");
        builder.addLabel("Email:", c.xy(1, 6));
        builder.add(new JTextField(), c.xy(2, 6));
        builder.appendRow("top:pref");
        builder.addSeparator("Work", c.xywh(1, 7, 2, 1));
        builder.appendRow("top:pref");
        builder.addLabel("Company:", c.xy(1, 8));
        builder.add(new JTextField(), c.xy(2, 8));
        builder.appendRow("top:pref");
        builder.addLabel("Phone:", c.xy(1, 9));
        builder.add(new JTextField(), c.xy(2, 9));
        builder.appendRow("top:pref");
        builder.addLabel("Fax:", c.xy(1, 10));
        builder.add(new JTextField(), c.xy(2, 10));
        add(builder.getPanel());
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Panel Builder Example 1");
      f.setDefaultCloseOperation(2);
      f.add(new PanelBuilderExample1());
      f.pack();
      f.setVisible(true);
    }
}





Panel Builder Example 2

/*
Code revised from Desktop Java Live:
http://www.sourcebeat.ru/downloads/
*/

import java.awt.BorderLayout;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.FormLayout;
public class PanelBuilderExample2 extends JPanel {
    public PanelBuilderExample2() {
      super(new BorderLayout());
        PanelBuilder builder = new PanelBuilder(new FormLayout(""));
        builder.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        builder.appendColumn("right:pref");
        builder.appendColumn("fill:max(pref; 100px)");
        builder.appendRow("top:pref");
        builder.addLabel("First:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Last:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Married:");
        builder.nextColumn();
        builder.add(new JCheckBox());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Phone:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Fax:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Email:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addSeparator("Work");
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Company:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Phone:");
        builder.nextColumn();
        builder.add(new JTextField());
        builder.appendRow("top:pref");
        builder.nextLine();
        builder.addLabel("Fax:");
        builder.nextColumn();
        builder.add(new JTextField());
        add(builder.getPanel());
    }
    public static void main(String[] a){
      JFrame f = new JFrame("FormLayout: Panel Builder Example 2");
      f.setDefaultCloseOperation(2);
      f.add(new PanelBuilderExample2());
      f.pack();
      f.setVisible(true);
    }
}





Shows three approaches how to add custom rows to a form that is built using a DefaultFormBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
/**
 * Shows three approaches how to add custom rows to a form that is built
 * using a DefaultFormBuilder.<ol> 
 * <li> single custom row, 
 * <li> standard + custom row, 
 * <li> multiple standard rows.
 * </ol>
 * These differ in the position of the "Comment" label, the alignment 
 * of font baselines and the height of the custom row. 
 *
 * @author Karsten Lentzsch
 * @version $Revision: 1.7 $
 * 
 * @see    DefaultFormBuilder
 * @see    DefaultFormWithCustomAreasExample
 */
public class DefaultFormWithCustomRowsExample {
    private JTextField name1Field;
    private JTextArea  comment1Area;
    private JTextField name2Field;
    private JTextArea  comment2Area;
    private JTextField name3Field;
    private JTextArea  comment3Area;
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Custom Rows");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new DefaultFormWithCustomRowsExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        name1Field     = new JTextField("Name - font baselines shall be aligned");
        name2Field     = new JTextField("Name - font baselines shall be aligned");
        name3Field     = new JTextField("Name - font baselines shall be aligned");
        comment1Area   = new JTextArea(2, 20);
        comment2Area   = new JTextArea(2, 20);
        comment3Area   = new JTextArea(2, 20);
        comment1Area.setText("Comment - likely baselines are unaligned");
        comment2Area.setText("Comment - baselines shall be aligned");
        comment3Area.setText("Comment - baselines shall be aligned");
    }

    // Building ***************************************************************
    /**
     * Demonstrates three different ways to add custom rows to a form
     * that is build with a {@link DefaultFormBuilder}.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        FormLayout layout = new FormLayout(
                "right:pref, 3dlu, min:grow", 
                "");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.setRowGroupingEnabled(true);
        
        CellConstraints cc = new CellConstraints();
        // In this approach, we add a gap and a custom row.
        // The advantage of this approach is, that we can express
        // the row spec and comment area cell constraints freely.
        // The disadvantage is the misalignment of the leading label.
        // Also the row"s height may be inconsistent with other rows. 
        builder.appendSeparator("Single Custom Row");
        builder.append("Name", name1Field); 
        builder.appendRow(builder.getLineGapSpec());
        builder.appendRow(new RowSpec("top:31dlu")); // Assumes line is 14, gap is 3
        builder.nextLine(2);
        builder.append("Comment");
        builder.add(new JScrollPane(comment1Area), 
                    cc.xy(builder.getColumn(), builder.getRow(), "fill, fill"));
        builder.nextLine();
        // In this approach, we append a standard row with gap before it.
        // The advantage is, that the leading label is aligned well.
        // The disadvantage is that the comment area now spans
        // multiple cells and is slightly less flexible.
        // Also the row"s height may be inconsistent with other rows. 
        builder.appendSeparator("Standard + Custom Row");
        builder.append("Name", name2Field); 
        builder.append("Comment");
        builder.appendRow(new RowSpec("17dlu")); // Assumes line is 14, gap is 3
        builder.add(new JScrollPane(comment2Area), 
                    cc.xywh(builder.getColumn(), builder.getRow(), 1, 2));
        builder.nextLine(2);
        // In this approach, we append two standard rows with associated gaps.
        // The advantage is, that the leading label is aligned well, 
        // and the height is consistent with other rows.
        // The disadvantage is that the comment area now spans
        // multiple cells and is slightly less flexible.
        builder.appendSeparator("Two Standard Rows");
        builder.append("Name", name3Field); 
        builder.append("Comment");
        builder.nextLine();
        builder.append("");
        builder.nextRow(-2);
        builder.add(new JScrollPane(comment3Area), 
                    cc.xywh(builder.getColumn(), builder.getRow(), 1, 3));
        return builder.getPanel();
    }

}





The different sizing units provided by the FormLayout

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the different sizing units provided by the FormLayout:
 * Pixel, Dialog Units (dlu), Point, Millimeter, Centimeter and Inches. 
 * Pt, mm, cm, in honor the screen resolution; dlus honor the font size too.
 * 
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 */
public class UnitsExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Units");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new UnitsExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add("Horizontal",     buildHorizontalUnitsPanel());
        tabbedPane.add("Horizontal Dlu", buildHorizontalDluPanel());
        tabbedPane.add("Vertical",       buildVerticalUnitsPanel());
        tabbedPane.add("Vertical Dlu",   buildVerticalDluPanel());
        return tabbedPane;
    }
    
    
    private JComponent buildHorizontalUnitsPanel() {
        FormLayout layout = new FormLayout(
            "right:pref, 1dlu, left:pref, 4dlu, left:pref",   
            ""); 
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.append("72",   new JLabel("pt"), buildHorizontalPanel("72pt"));
        builder.append("25.4", new JLabel("mm"), buildHorizontalPanel("25.4mm"));
        builder.append("2.54", new JLabel("cm"), buildHorizontalPanel("2.54cm"));
        builder.append("1",    new JLabel("in"), buildHorizontalPanel("1in"));
        builder.append("72",   new JLabel("px"), buildHorizontalPanel("72px"));
        builder.append("96",   new JLabel("px"), buildHorizontalPanel("96px"));
        builder.append("120",  new JLabel("px"), buildHorizontalPanel("120px"));
        
        return builder.getPanel();
    }
    
    
    private JComponent buildHorizontalDluPanel() {
        FormLayout layout = new FormLayout(
            "right:pref, 1dlu, left:pref, 4dlu, left:pref",   
            ""); 
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.append("9",  new JLabel("cols"), buildHorizontalPanel(9));
        builder.append("50", new JLabel("dlu"),  buildHorizontalPanel("50dlu"));
        builder.append("75", new JLabel("px"),   buildHorizontalPanel("75px"));
        builder.append("88", new JLabel("px"),   buildHorizontalPanel("88px"));
        builder.append("100",new JLabel("px"),   buildHorizontalPanel("100px"));
        
        return builder.getPanel();
    }
    
    
    private JComponent buildVerticalUnitsPanel() {
        FormLayout layout = new FormLayout(
            "c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p",   
            "pref, 6dlu, top:pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("72 pt"),            cc.xy(1, 1));
        panel.add(buildVerticalPanel("72pt"),     cc.xy(1, 3));
        
        panel.add(new JLabel("25.4 mm"),          cc.xy(3, 1));
        panel.add(buildVerticalPanel("25.4mm"),   cc.xy(3, 3));
        
        panel.add(new JLabel("2.54 cm"),          cc.xy(5, 1));
        panel.add(buildVerticalPanel("2.54cm"),   cc.xy(5, 3));
        
        panel.add(new JLabel("1 in"),             cc.xy(7, 1));
        panel.add(buildVerticalPanel("1in"),      cc.xy(7, 3));
        panel.add(new JLabel("72 px"),            cc.xy(9, 1));
        panel.add(buildVerticalPanel("72px"),     cc.xy(9, 3));
        
        panel.add(new JLabel("96 px"),           cc.xy(11, 1));
        panel.add(buildVerticalPanel("96px"),    cc.xy(11, 3));
        
        panel.add(new JLabel("120 px"),           cc.xy(13, 1));
        panel.add(buildVerticalPanel("120px"),    cc.xy(13, 3));
        
        return panel;
    }
    
    private JComponent buildVerticalDluPanel() {
        FormLayout layout = new FormLayout(
            "c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p, 4dlu, c:p",   
            "pref, 6dlu, top:pref, 25dlu, pref, 6dlu, top:pref"); 
            
        JPanel panel = new JPanel(layout);
        panel.setBorder(Borders.DIALOG_BORDER);
        CellConstraints cc = new CellConstraints();
        panel.add(new JLabel("4 rows"),           cc.xy(1, 1));
        panel.add(buildVerticalPanel("pref", 4),  cc.xy(1, 3));
        
        panel.add(new JLabel("42 dlu"),           cc.xy(3, 1));
        panel.add(buildVerticalPanel("42dlu", 4), cc.xy(3, 3));
        
        panel.add(new JLabel("57 px"),            cc.xy(5, 1));
        panel.add(buildVerticalPanel("57px", 4),  cc.xy(5, 3));
        
        panel.add(new JLabel("63 px"),            cc.xy(7, 1));
        panel.add(buildVerticalPanel("63px", 4),  cc.xy(7, 3));
        
        panel.add(new JLabel("68 px"),            cc.xy(9, 1));
        panel.add(buildVerticalPanel("68px", 4),  cc.xy(9, 3));
        
        panel.add(new JLabel("field"),            cc.xy(1, 5));
        panel.add(new JTextField(4),              cc.xy(1, 7));
        
        panel.add(new JLabel("14 dlu"),           cc.xy(3, 5));
        panel.add(buildVerticalPanel("14dlu"),    cc.xy(3, 7));
        
        panel.add(new JLabel("21 px"),            cc.xy(5, 5));
        panel.add(buildVerticalPanel("21px"),     cc.xy(5, 7));
        
        panel.add(new JLabel("23 px"),            cc.xy(7, 5));
        panel.add(buildVerticalPanel("23px"),     cc.xy(7, 7));
        
        panel.add(new JLabel("24 px"),            cc.xy(9, 5));
        panel.add(buildVerticalPanel("24px"),     cc.xy(9, 7));
        
        panel.add(new JLabel("button"),           cc.xy(11, 5));
        panel.add(new JButton("..."),             cc.xy(11, 7));
        
        return panel;
    }
    
    
    
    // Component Creation *****************************************************
    
    private JComponent createTextArea(int rows, int cols) {
        JTextArea area = new JTextArea(rows, cols);
        //area.setText(text);
        return new JScrollPane(area,
                    ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    }
    
    // Helper Code ************************************************************
    
    private JComponent buildHorizontalPanel(String width) {
        FormLayout layout = new FormLayout(width, "pref");
        JPanel panel = new JPanel(layout);
        panel.add(new JTextField(), new CellConstraints(1, 1));
        return panel;
    }
    
    private JComponent buildHorizontalPanel(int columns) {
        FormLayout layout = new FormLayout("pref, 4dlu, pref", "pref");
        JPanel panel = new JPanel(layout);
        CellConstraints cc = new CellConstraints();
        panel.add(new JTextField(columns),                
                  cc.xy(1, 1));
        panel.add(new JLabel("Width of new JTextField(" + columns + ")"), 
                  cc.xy(3, 1));
        return panel;
    }
    
    private JComponent buildVerticalPanel(String height) {
        return buildVerticalPanel(height, 10);
    }
    
    private JComponent buildVerticalPanel(String height, int rows) {
        FormLayout layout = new FormLayout("pref", "fill:"+ height);
        JPanel panel = new JPanel(layout);
        CellConstraints cc = new CellConstraints();
        panel.add(createTextArea(rows, 5), cc.xy(1, 1));
        return panel;
    }
    
    
}





The use of Factories as provided by the Forms framework

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.ruponent;
import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.Sizes;
/**
 * Demonstrates the use of Factories as provided by the Forms framework.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.9 $
 * 
 * @see  com.jgoodies.forms.factories.ButtonBarFactory
 */
public class FormFactoryExample {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: FormFactory");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new FormFactoryExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }
    public JComponent buildPanel() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.putClientProperty("jgoodies.noContentBorder", Boolean.TRUE);
        tabbedPane.add(buildDefaultForm(1, 1),  "1 - 1");
        tabbedPane.add(buildDefaultForm(1, 2),  "1 - 2");
        tabbedPane.add(buildDefaultForm(1, 3),  "1 - 3");
        tabbedPane.add(buildDefaultForm(2, 1),  "2 - 1");
        tabbedPane.add(buildDefaultForm(2, 2),  "2 - 2");
        tabbedPane.add(buildDefaultForm(3, 1),  "3 - 1");
        return tabbedPane;
    }

    private Component buildDefaultForm(int majorCols, int minorCols) {
        FormLayout layout =
            FormFactory.createColumnLayout(
                majorCols,
                minorCols,
                new ColumnSpec("right:p"),
                Sizes.DLUX9,
                Sizes.DLUX1);
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.setLeadingColumnOffset(1);
        buildParagraph(builder, 4, majorCols, minorCols, "Propeller Shaft");
        buildParagraph(builder, 3, majorCols, minorCols, "Intermediate Shaft");
        return builder.getContainer();
    }
    private void buildParagraph(
        DefaultFormBuilder builder,
        int rows,
        int majorCols,
        int minorCols,
        String text) {
        builder.appendSeparator(text);
        for (int row = 0; row < rows; row++) {
            buildRow(builder, majorCols, minorCols);
        }
    }
    private void buildRow(
        DefaultFormBuilder builder,
        int majorCols,
        int minorCols) {
        int charCols = 50 / (majorCols * (1 + minorCols));
        for (int majorCol = 0; majorCol < majorCols; majorCol++) {
            buildSection(builder, minorCols, charCols);
        }
        builder.nextLine();
    }
    private void buildSection(DefaultFormBuilder builder, int minorCols, int charCols) {
        builder.append(nextLabel(), new JTextField(charCols));
        for (int minorCol = 1; minorCol < minorCols; minorCol++) {
            builder.append(new JTextField(charCols));
        }
    }
    // Helper Code ************************************************************
    private static int nextInt = 0;
    private String nextLabel() {
        if (nextInt++ == LABELS.length - 1)
            nextInt = 0;
        return LABELS[nextInt];
    }
    
    private static final String[] LABELS = {
        "da [mm]", "ds [mm]", "kl [cm]", "Weight [Kg]", "Size [mm]",
        "da2 [mm]", "ds2 [mm]", "cv [cm]", "pl [cm]", "mt [mm]",
        "ep [mm]", "cvn [mm]", "nz [cm]", "Power [kW]", "Length [cm]",
        "R [cm]", "D [mm]", "PTI [kW]"
    };
}





Three FormLayout component sizes: minimum, default and preferred

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import java.awt.Insets;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Demonstrates the three FormLayout component sizes: minimum, default and 
 * preferred.
 * Min and Pref measure the components minimum and preferred size, where the 
 * Default size behaves like Pref but shrinks if the container space is scarce.
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.8 $
 */
public class ComponentSizesExample {
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Component Sizes");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new ComponentSizesExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public JComponent buildPanel() {
        JSplitPane splitPane = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,
            true,
            buildCombinedPanel(), 
            buildTextPanel());
        return splitPane;
    }
    
        
    /**
     * Builds and answer the panel that combines the three sizing panels.
     * 
     * @return the combined panel
     */
    private JComponent buildCombinedPanel() {
        FormLayout layout = new FormLayout(
            "30dlu:grow",
            "pref, 3dlu, pref, 3dlu, pref");
            
        PanelBuilder builder = new PanelBuilder(layout);
        builder.setDefaultDialogBorder();
        CellConstraints cc = new CellConstraints();
        builder.add(buildMinimumSizePanel(),   cc.xy(1, 1));
        builder.add(buildDefaultSizePanel(),   cc.xy(1, 3));
        builder.add(buildPreferredSizePanel(), cc.xy(1, 5));
        
        return builder.getPanel();
    }
    
    private JComponent buildMinimumSizePanel() {
        FormLayout layout = new FormLayout( 
                "right:max(25dlu;pref), 3dlu, min",
                "pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.append("Min", new JTextField(15));
        return builder.getPanel();
    }
    
    private JComponent buildDefaultSizePanel() {
        FormLayout layout = new FormLayout(
                "right:max(25dlu;pref), 3dlu, default",
                "pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.append("Default", new JTextField(15));
        return builder.getPanel();
    }
    
    private JComponent buildPreferredSizePanel() {
        FormLayout layout = new FormLayout(
                "right:max(25dlu;pref), 3dlu, pref",
                "pref");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.append("Pref", new JTextField(15));
        return builder.getPanel();
    }
    
    private JComponent buildTextPanel() {
        JTextArea textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        textArea.setMargin(new Insets(6, 10, 4, 6));
        textArea.setText("The text field used in the example on the left\n" +
        "has a narrow minimum width and a wider preferred width.\n\n" +
        "If you move the split divider to the left and right\n" +
        "you can see how "Default" shrinks the field if space is scarce.\n\n" +
        "If there"s not enough space for the preferred width\n" + 
        "the bottom field will be "cut" on the right-hand side.");
        JScrollPane scrollpane = new JScrollPane(textArea);
        scrollpane.setBorder(new EmptyBorder(0, 0, 0, 0));
        return scrollpane;
    }
    
    
}





Uses the FormLayout and the DefaultFormBuilder

/*
 * Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *  o Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer. 
 *     
 *  o 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. 
 *     
 *  o Neither the name of JGoodies Karsten Lentzsch nor the names of 
 *    its contributors may be used to endorse or promote products derived 
 *    from this software without specific prior written permission. 
 *     
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. 
 */

import javax.swing.*;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
 * Uses the FormLayout and the <code>DefaultFormBuilder</code>. 
 * Columns are specified before the panel is filled with components, 
 * rows are added dynamically. The builder is used to hold a cursor, 
 * to add rows dynamically, and to fill components. 
 * The builder"s convenience methods are used to add labels and separators.<p>
 *  
 * This panel building style is recommended unless you have a more
 * powerful builder or don"t want to add rows dynamically. 
 * See the {@link DynamicRowsExample} for an implementation that specifies 
 * rows before the panel is filled with components. 
 *
 * @author  Karsten Lentzsch
 * @version $Revision: 1.8 $
 * 
 * @see     DefaultFormBuilder
 * @see     PlainExample
 * @see     RowCounterExample
 * @see     DynamicRowsExample
 */
public class DefaultFormBuilderExample {
    private JTextField identifierField;
    private JTextField ptiField;
    private JTextField powerField;
    private JTextField sField;
    private JTextField daField;
    private JTextField diField;
    private JTextField da2Field;
    private JTextField di2Field;
    private JTextField rField;
    private JTextField dField;
    private JComboBox  locationCombo;
    private JTextField kFactorField;
    
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.jgoodies.plaf.plastic.PlasticXPLookAndFeel");
        } catch (Exception e) {
            // Likely PlasticXP is not in the class path; ignore.
        }
        JFrame frame = new JFrame();
        frame.setTitle("Forms Tutorial :: Default Form");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JComponent panel = new DefaultFormBuilderExample().buildPanel();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    // Component Creation and Initialization **********************************
    /**
     *  Creates and intializes the UI components.
     */
    private void initComponents() {
        identifierField = new JTextField();
        ptiField        = new JTextField();
        powerField      = new JTextField();
        sField          = new JTextField();
        daField         = new JTextField();
        diField         = new JTextField();
        da2Field        = new JTextField();
        di2Field        = new JTextField();
        rField          = new JTextField();
        dField          = new JTextField();
        locationCombo   = createLocationComboBox();
        kFactorField    = new JTextField();
    }
    /**
     * Creates and returns a combo box for the locations.
     * 
     * @return a combo box for three locations
     */
    private JComboBox createLocationComboBox() {
        return new JComboBox(
            new String[] {
                "Propeller nut thread",
                "Stern tube front area",
                "Shaft taper" });
    }

    // Building ***************************************************************
    /**
     * Builds the flange editor panel. 
     * Columns are specified before components are added to the form, 
     * rows are added dynamically using the {@link DefaultFormBuilder}.<p>
     * 
     * The builder combines a step that is done again and again:
     * add a label, proceed to the next data column and add a component.
     * 
     * @return the built panel
     */
    public JComponent buildPanel() {
        initComponents();
        FormLayout layout = new FormLayout(
                "right:max(40dlu;pref), 3dlu, 70dlu, 7dlu, "
              + "right:max(40dlu;pref), 3dlu, 70dlu",
                "");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();

        builder.appendSeparator("Flange");
        builder.append("&Identifier", identifierField);
        builder.nextLine();
        builder.append("PTI [kW]",   ptiField);          
        builder.append("Power [kW]", powerField);
        builder.append("s [mm]",     sField);
        builder.nextLine();

        builder.appendSeparator("Diameters");
        builder.append("&da [mm]",   daField);          
        builder.append("di [mm]",    diField);
        builder.append("da2 [mm]",   da2Field);          
        builder.append("di2 [mm]",   di2Field);
        builder.append("R [mm]",     rField);          
        builder.append("D [mm]",     dField);

        builder.appendSeparator("Criteria");
        builder.append("&Location",  locationCombo);   
        builder.append("k-factor",   kFactorField);
        return builder.getPanel();
    }
}