Java/Swing Components/FormLayout

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

Содержание

Build a panel with a leading indent column using the DefaultFormBuilder

   <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.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.

* * 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(); } } </source>

Build button stacks using the ButtonStackBuilder

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

}

      </source>
   
  
 
  



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

   <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 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 OrientationUtils 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 all
* 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

   <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 FormLayout with the PanelBuilder. 
* 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();
   }

}

      </source>
   
  
 
  



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

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

}

      </source>
   
  
 
  



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

   <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.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:
    *
  1. using two custom rows to align the leading label, *
  2. using a single custom row with label on top, *
  3. using a separator. *
* 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();
   }
}
          
      </source>
   
  
 
  



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

   <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.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 #buildPanel(). 
*
* @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();
   }
   

}

      </source>
   
  
 
  



Demonstrates a frequent pitfall when specifying a growing row

   <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 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();
   }
   
   
}
          
      </source>
   
  
 
  



Demonstrates a pure use of the FormLayout

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

}

      </source>
   
  
 
  



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

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

}


      </source>
   
  
 
  



Demonstrates how to build button bars using a ButtonBarBuilder

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

}


      </source>
   
  
 
  



Demonstrates how to build button bars with a fixed button order

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

}


      </source>
   
  
 
  



Demonstrates how to find bugs in the layout using

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

}

      </source>
   
  
 
  



Demonstrates sizes: constant, minimum, preferred

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


}


      </source>
   
  
 
  



Demonstrates the basic FormLayout sizes: constant, minimum, preferred

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

}


      </source>
   
  
 
  



Demonstrates the different FormLayout alignments

   <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.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
Two</html>"); }

}


      </source>
   
  
 
  



FormLayout: Basic Example 1

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Bounds Example 6

   <source lang="java">

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

}

      </source>
   
  
 
  



FormLayout: Button Bar Builder Example

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Button Bar Builder Example 2

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Button Bar Builder Example 3

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Button Stack Builder Example 1

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Default Alignment Example 2

   <source lang="java">

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

}

      </source>
   
  
 
  



FormLayout: Default Form Builder Example 1

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Explicit Alignment Example 3

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Grouping Example 10

   <source lang="java">

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

}

      </source>
   
  
 
  



FormLayout: Growable Example 8

   <source lang="java">

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

}

      </source>
   
  
 
  



FormLayout growing options: none, default, weighted

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

}

      </source>
   
  
 
  



FormLayout: No Grouping Example 9

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Size Specification Example 4

   <source lang="java">

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

}

      </source>
   
  
 
  



FormLayout: Spacing Example 5

   <source lang="java">

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

}


      </source>
   
  
 
  



FormLayout: Spanning Example 7

   <source lang="java">

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

}

      </source>
   
  
 
  



How columns and rows can be grouped in FormLayout

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

}


      </source>
   
  
 
  



How components can span multiple columns and rows

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

}


      </source>
   
  
 
  



How FormLayout applies the default column and

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

}


      </source>
   
  
 
  



Panel Builder Example 1

   <source lang="java">

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

}


      </source>
   
  
 
  



Panel Builder Example 2

   <source lang="java">

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

}


      </source>
   
  
 
  



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

   <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.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.
    *
  1. single custom row, *
  2. standard + custom row, *
  3. multiple standard rows. *
* 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();
   }

}

      </source>
   
  
 
  



The different sizing units provided by the FormLayout

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

}


      </source>
   
  
 
  



The use of Factories as provided by the Forms framework

   <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 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]"
   };

}

      </source>
   
  
 
  



Three FormLayout component sizes: minimum, default and preferred

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

}


      </source>
   
  
 
  



Uses the FormLayout and the DefaultFormBuilder

   <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.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; /**

* Uses the FormLayout and the DefaultFormBuilder. 
* 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();
   }

}

      </source>