Java/Swing Components/FormLayout
Содержание
- 1 Build a panel with a leading indent column using the DefaultFormBuilder
- 2 Build button stacks using the ButtonStackBuilder
- 3 Build panels component orientation: left-to-right vs. right-to-left
- 4 Columns and rows are specified before the panel is filled with components
- 5 Columns and rows are specified before the panel is filled with components 1
- 6 Compares approaches how to append a custom area at the end of a panel built with the DefaultFormBuilder
- 7 Create and configure a layout, create a builder, add components
- 8 Demonstrates a frequent pitfall when specifying a growing row
- 9 Demonstrates a pure use of the FormLayout
- 10 Demonstrates how a JTextArea"s preferred size grows with the container if no columns and rows are set
- 11 Demonstrates how to build button bars using a ButtonBarBuilder
- 12 Demonstrates how to build button bars with a fixed button order
- 13 Demonstrates how to find bugs in the layout using
- 14 Demonstrates sizes: constant, minimum, preferred
- 15 Demonstrates the basic FormLayout sizes: constant, minimum, preferred
- 16 Demonstrates the different FormLayout alignments
- 17 FormLayout: Basic Example 1
- 18 FormLayout: Bounds Example 6
- 19 FormLayout: Button Bar Builder Example
- 20 FormLayout: Button Bar Builder Example 2
- 21 FormLayout: Button Bar Builder Example 3
- 22 FormLayout: Button Stack Builder Example 1
- 23 FormLayout: Default Alignment Example 2
- 24 FormLayout: Default Form Builder Example 1
- 25 FormLayout: Explicit Alignment Example 3
- 26 FormLayout: Grouping Example 10
- 27 FormLayout: Growable Example 8
- 28 FormLayout growing options: none, default, weighted
- 29 FormLayout: No Grouping Example 9
- 30 FormLayout: Size Specification Example 4
- 31 FormLayout: Spacing Example 5
- 32 FormLayout: Spanning Example 7
- 33 How columns and rows can be grouped in FormLayout
- 34 How components can span multiple columns and rows
- 35 How FormLayout applies the default column and
- 36 Panel Builder Example 1
- 37 Panel Builder Example 2
- 38 Shows three approaches how to add custom rows to a form that is built using a DefaultFormBuilder
- 39 The different sizing units provided by the FormLayout
- 40 The use of Factories as provided by the Forms framework
- 41 Three FormLayout component sizes: minimum, default and preferred
- 42 Uses the FormLayout and the DefaultFormBuilder
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 theFormLayout
with thePanelBuilder
. * 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:
-
*
- using two custom rows to align the leading label, *
- using a single custom row with label on top, *
- 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.
-
*
- single custom row, *
- standard + custom row, *
- 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>