diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f91844d..53942136 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ FlatLaf Change Log easier to recognize the tabbed pane. - TabbedPane: Added top and bottom tab insets to avoid that large tab icons are painted over active tab underline. +- TabbedPane: Support hiding separator between tabs and content area (set client + property `JTabbedPane.showContentSeparator` to `false`). ## 0.42 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 782995e0..05183459 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -216,6 +216,14 @@ public interface FlatClientProperties */ String TABBED_PANE_SHOW_TAB_SEPARATORS = "JTabbedPane.showTabSeparators"; + /** + * Specifies whether the separator between tabs area and content area should be shown. + *
+ * Component {@link javax.swing.JTabbedPane}
+ * Value type {@link java.lang.Boolean}
+ */
+ String TABBED_PANE_SHOW_CONTENT_SEPARATOR = "JTabbedPane.showContentSeparator";
+
/**
* Specifies whether a full border is painted around a tabbed pane.
*
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 2b5f26b8..ed319855 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -196,6 +196,7 @@ public class FlatTabbedPaneUI switch( e.getPropertyName() ) { case TABBED_PANE_SHOW_TAB_SEPARATORS: + case TABBED_PANE_SHOW_CONTENT_SEPARATOR: case TABBED_PANE_HAS_FULL_BORDER: case TABBED_PANE_TAB_HEIGHT: tabPane.revalidate(); @@ -255,6 +256,9 @@ public class FlatTabbedPaneUI */ @Override protected Insets getContentBorderInsets( int tabPlacement ) { + if( contentSeparatorHeight == 0 || !clientPropertyBoolean( tabPane, TABBED_PANE_SHOW_CONTENT_SEPARATOR, true ) ) + return new Insets( 0, 0, 0, 0 ); + boolean hasFullBorder = clientPropertyBoolean( tabPane, TABBED_PANE_HAS_FULL_BORDER, this.hasFullBorder ); int sh = scale( contentSeparatorHeight ); Insets insets = hasFullBorder ? new Insets( sh, sh, sh, sh ) : new Insets( sh, 0, 0, 0 ); @@ -359,7 +363,10 @@ public class FlatTabbedPaneUI protected void paintTabSelection( Graphics g, int tabPlacement, int x, int y, int w, int h ) { // increase clip bounds in scroll-tab-layout to paint over the separator line Rectangle clipBounds = isScrollTabLayout() ? g.getClipBounds() : null; - if( clipBounds != null ) { + if( clipBounds != null && + this.contentSeparatorHeight != 0 && + clientPropertyBoolean( tabPane, TABBED_PANE_SHOW_CONTENT_SEPARATOR, true ) ) + { Rectangle newClipBounds = new Rectangle( clipBounds ); int contentSeparatorHeight = scale( this.contentSeparatorHeight ); switch( tabPlacement ) { @@ -436,43 +443,49 @@ public class FlatTabbedPaneUI // remove tabs from bounds switch( tabPlacement ) { - case LEFT: - x += calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); - if( tabsOverlapBorder ) - x -= tabAreaInsets.right; - w -= (x - insets.left); - break; - case RIGHT: - w -= calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); - if( tabsOverlapBorder ) - w += tabAreaInsets.left; - break; - case BOTTOM: - h -= calculateTabAreaHeight( tabPlacement, runCount, maxTabHeight ); - if( tabsOverlapBorder ) - h += tabAreaInsets.top; - break; case TOP: default: y += calculateTabAreaHeight( tabPlacement, runCount, maxTabHeight ); if( tabsOverlapBorder ) y -= tabAreaInsets.bottom; h -= (y - insets.top); + break; + + case BOTTOM: + h -= calculateTabAreaHeight( tabPlacement, runCount, maxTabHeight ); + if( tabsOverlapBorder ) + h += tabAreaInsets.top; + break; + + case LEFT: + x += calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); + if( tabsOverlapBorder ) + x -= tabAreaInsets.right; + w -= (x - insets.left); + break; + + case RIGHT: + w -= calculateTabAreaWidth( tabPlacement, runCount, maxTabWidth ); + if( tabsOverlapBorder ) + w += tabAreaInsets.left; + break; } - // compute insets for separator or full border - boolean hasFullBorder = clientPropertyBoolean( tabPane, TABBED_PANE_HAS_FULL_BORDER, this.hasFullBorder ); - int sh = scale( contentSeparatorHeight * 100 ); // multiply by 100 because rotateInsets() does not use floats - Insets ci = new Insets( 0, 0, 0, 0 ); - rotateInsets( hasFullBorder ? new Insets( sh, sh, sh, sh ) : new Insets( sh, 0, 0, 0 ), ci, tabPlacement ); + if( contentSeparatorHeight != 0 && clientPropertyBoolean( tabPane, TABBED_PANE_SHOW_CONTENT_SEPARATOR, true ) ) { + // compute insets for separator or full border + boolean hasFullBorder = clientPropertyBoolean( tabPane, TABBED_PANE_HAS_FULL_BORDER, this.hasFullBorder ); + int sh = scale( contentSeparatorHeight * 100 ); // multiply by 100 because rotateInsets() does not use floats + Insets ci = new Insets( 0, 0, 0, 0 ); + rotateInsets( hasFullBorder ? new Insets( sh, sh, sh, sh ) : new Insets( sh, 0, 0, 0 ), ci, tabPlacement ); - // paint content area - g.setColor( contentAreaColor ); - Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); - path.append( new Rectangle2D.Float( x, y, w, h ), false ); - path.append( new Rectangle2D.Float( x + (ci.left / 100f), y + (ci.top / 100f), - w - (ci.left / 100f) - (ci.right / 100f), h - (ci.top / 100f) - (ci.bottom / 100f) ), false ); - ((Graphics2D)g).fill( path ); + // paint content separator or full border + g.setColor( contentAreaColor ); + Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); + path.append( new Rectangle2D.Float( x, y, w, h ), false ); + path.append( new Rectangle2D.Float( x + (ci.left / 100f), y + (ci.top / 100f), + w - (ci.left / 100f) - (ci.right / 100f), h - (ci.top / 100f) - (ci.bottom / 100f) ), false ); + ((Graphics2D)g).fill( path ); + } // repaint selection in scroll-tab-layout because it may be painted before // the content border was painted (from BasicTabbedPaneUI$ScrollableTabPanel) diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.java index 8e226d68..420a2c78 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.java @@ -17,6 +17,7 @@ package com.formdev.flatlaf.demo; import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_HAS_FULL_BORDER; +import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_SHOW_CONTENT_SEPARATOR; import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_SHOW_TAB_SEPARATORS; import java.awt.*; import javax.swing.*; @@ -58,18 +59,24 @@ class TabsPanel private void showTabSeparatorsChanged() { Boolean showTabSeparators = showTabSeparatorsCheckBox.isSelected() ? true : null; - tabbedPane1.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane2.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane3.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane4.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); + putTabbedPanesClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); + } + + private void hideContentSeparatorChanged() { + Boolean showContentSeparator = hideContentSeparatorCheckBox.isSelected() ? false : null; + putTabbedPanesClientProperty( TABBED_PANE_SHOW_CONTENT_SEPARATOR, showContentSeparator ); } private void hasFullBorderChanged() { Boolean hasFullBorder = hasFullBorderCheckBox.isSelected() ? true : null; - tabbedPane1.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane2.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane3.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane4.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); + putTabbedPanesClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); + } + + private void putTabbedPanesClientProperty( String key, Object value ) { + tabbedPane1.putClientProperty( key, value ); + tabbedPane2.putClientProperty( key, value ); + tabbedPane3.putClientProperty( key, value ); + tabbedPane4.putClientProperty( key, value ); } private void moreTabsChanged() { @@ -155,6 +162,7 @@ class TabsPanel moreTabsCheckBox = new JCheckBox(); tabScrollCheckBox = new JCheckBox(); showTabSeparatorsCheckBox = new JCheckBox(); + hideContentSeparatorCheckBox = new JCheckBox(); hasFullBorderCheckBox = new JCheckBox(); CellConstraints cc = new CellConstraints(); @@ -278,6 +286,7 @@ class TabsPanel "[]" + "[]" + "[]" + + "[fill]" + "[]", // rows "[center]")); @@ -299,10 +308,15 @@ class TabsPanel showTabSeparatorsCheckBox.addActionListener(e -> showTabSeparatorsChanged()); panel14.add(showTabSeparatorsCheckBox, "cell 2 0"); + //---- hideContentSeparatorCheckBox ---- + hideContentSeparatorCheckBox.setText("Hide content separator"); + hideContentSeparatorCheckBox.addActionListener(e -> hideContentSeparatorChanged()); + panel14.add(hideContentSeparatorCheckBox, "cell 3 0"); + //---- hasFullBorderCheckBox ---- hasFullBorderCheckBox.setText("Show content border"); hasFullBorderCheckBox.addActionListener(e -> hasFullBorderChanged()); - panel14.add(hasFullBorderCheckBox, "cell 3 0,alignx left,growx 0"); + panel14.add(hasFullBorderCheckBox, "cell 4 0,alignx left,growx 0"); } panel9.add(panel14, cc.xywh(1, 11, 3, 1)); } @@ -318,6 +332,7 @@ class TabsPanel private JCheckBox moreTabsCheckBox; private JCheckBox tabScrollCheckBox; private JCheckBox showTabSeparatorsCheckBox; + private JCheckBox hideContentSeparatorCheckBox; private JCheckBox hasFullBorderCheckBox; // JFormDesigner - End of variables declaration //GEN-END:variables } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.jfd index d592df5b..a05d3645 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/TabsPanel.jfd @@ -1,4 +1,4 @@ -JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8" +JFDML JFormDesigner: "7.0.2.0.298" Java: "15" encoding: "UTF-8" new FormModel { contentType: "form/swing" @@ -144,7 +144,7 @@ new FormModel { } ) add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { "$layoutConstraints": "insets 0,hidemode 3" - "$columnConstraints": "[][][][]" + "$columnConstraints": "[][][][fill][]" "$rowConstraints": "[center]" } ) { name: "panel14" @@ -180,6 +180,16 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 2 0" } ) + add( new FormComponent( "javax.swing.JCheckBox" ) { + name: "hideContentSeparatorCheckBox" + "text": "Hide content separator" + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } + addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "hideContentSeparatorChanged", false ) ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 0" + } ) add( new FormComponent( "javax.swing.JCheckBox" ) { name: "hasFullBorderCheckBox" "text": "Show content border" @@ -188,7 +198,7 @@ new FormModel { } addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "hasFullBorderChanged", false ) ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { - "value": "cell 3 0,alignx left,growx 0" + "value": "cell 4 0,alignx left,growx 0" } ) }, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) { "gridY": 11 @@ -199,7 +209,7 @@ new FormModel { } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) - "size": new java.awt.Dimension( 625, 515 ) + "size": new java.awt.Dimension( 700, 515 ) } ) } } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.java index 393fc1ec..4b89082a 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.java @@ -17,10 +17,12 @@ package com.formdev.flatlaf.testing; import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_HAS_FULL_BORDER; +import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_SHOW_CONTENT_SEPARATOR; import static com.formdev.flatlaf.FlatClientProperties.TABBED_PANE_SHOW_TAB_SEPARATORS; import java.awt.*; import javax.swing.*; import javax.swing.border.*; +import com.formdev.flatlaf.util.ScaledImageIcon; import com.jgoodies.forms.layout.*; import net.miginfocom.swing.*; @@ -65,18 +67,24 @@ public class FlatContainerTest private void showTabSeparatorsChanged() { Boolean showTabSeparators = showTabSeparatorsCheckBox.isSelected() ? true : null; - tabbedPane1.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane2.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane3.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); - tabbedPane4.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); + putTabbedPanesClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators ); + } + + private void hideContentSeparatorChanged() { + Boolean showContentSeparator = hideContentSeparatorCheckBox.isSelected() ? false : null; + putTabbedPanesClientProperty( TABBED_PANE_SHOW_CONTENT_SEPARATOR, showContentSeparator ); } private void hasFullBorderChanged() { Boolean hasFullBorder = hasFullBorderCheckBox.isSelected() ? true : null; - tabbedPane1.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane2.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane3.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); - tabbedPane4.putClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); + putTabbedPanesClientProperty( TABBED_PANE_HAS_FULL_BORDER, hasFullBorder ); + } + + private void putTabbedPanesClientProperty( String key, Object value ) { + tabbedPane1.putClientProperty( key, value ); + tabbedPane2.putClientProperty( key, value ); + tabbedPane3.putClientProperty( key, value ); + tabbedPane4.putClientProperty( key, value ); } private void moreTabsChanged() { @@ -98,7 +106,7 @@ public class FlatContainerTest addTab( tabbedPane, "Tab 8", "tab content 8" ); } else { int tabCount = tabbedPane.getTabCount(); - if( tabCount > 3 ) { + if( tabCount > 4 ) { for( int i = 0; i < 5; i++ ) tabbedPane.removeTabAt( tabbedPane.getTabCount() - 1 ); } @@ -115,6 +123,8 @@ public class FlatContainerTest addTab( tabbedPane, "Disabled", "tab content 3" ); tabbedPane.setEnabledAt( 2, false ); + + tabbedPane.addTab( "Tab 4", new JLabel( "non-opaque content", SwingConstants.CENTER ) ); } } @@ -146,7 +156,7 @@ public class FlatContainerTest Object iconSize = tabIconSizeSpinner.getValue(); Icon icon = showTabIcons - ? new ImageIcon( getClass().getResource( "/com/formdev/flatlaf/testing/test" + iconSize + ".png" ) ) + ? new ScaledImageIcon( new ImageIcon( getClass().getResource( "/com/formdev/flatlaf/testing/test" + iconSize + ".png" ) ) ) : null; tabbedPane.setIconAt( 0, icon ); tabbedPane.setIconAt( 1, icon ); @@ -174,6 +184,7 @@ public class FlatContainerTest moreTabsCheckBox = new JCheckBox(); tabScrollCheckBox = new JCheckBox(); showTabSeparatorsCheckBox = new JCheckBox(); + hideContentSeparatorCheckBox = new JCheckBox(); hasFullBorderCheckBox = new JCheckBox(); tabIconsCheckBox = new JCheckBox(); tabIconSizeSpinner = new JSpinner(); @@ -285,6 +296,7 @@ public class FlatContainerTest "[]" + "[]" + "[]" + + "[fill]" + "[]" + "[fill]" + "[fill]", @@ -308,21 +320,26 @@ public class FlatContainerTest showTabSeparatorsCheckBox.addActionListener(e -> showTabSeparatorsChanged()); panel14.add(showTabSeparatorsCheckBox, "cell 2 0"); + //---- hideContentSeparatorCheckBox ---- + hideContentSeparatorCheckBox.setText("Hide content separator"); + hideContentSeparatorCheckBox.addActionListener(e -> hideContentSeparatorChanged()); + panel14.add(hideContentSeparatorCheckBox, "cell 3 0"); + //---- hasFullBorderCheckBox ---- hasFullBorderCheckBox.setText("Show content border"); hasFullBorderCheckBox.addActionListener(e -> hasFullBorderChanged()); - panel14.add(hasFullBorderCheckBox, "cell 3 0,alignx left,growx 0"); + panel14.add(hasFullBorderCheckBox, "cell 4 0,alignx left,growx 0"); //---- tabIconsCheckBox ---- tabIconsCheckBox.setText("Tab icons"); tabIconsCheckBox.addActionListener(e -> tabIconsChanged()); - panel14.add(tabIconsCheckBox, "cell 4 0"); + panel14.add(tabIconsCheckBox, "cell 5 0"); //---- tabIconSizeSpinner ---- tabIconSizeSpinner.setModel(new SpinnerListModel(new String[] {"16", "24", "32", "48", "64"})); tabIconSizeSpinner.setEnabled(false); tabIconSizeSpinner.addChangeListener(e -> tabIconsChanged()); - panel14.add(tabIconSizeSpinner, "cell 5 0"); + panel14.add(tabIconSizeSpinner, "cell 6 0"); } panel9.add(panel14, cc.xywh(1, 11, 3, 1)); } @@ -338,6 +355,7 @@ public class FlatContainerTest private JCheckBox moreTabsCheckBox; private JCheckBox tabScrollCheckBox; private JCheckBox showTabSeparatorsCheckBox; + private JCheckBox hideContentSeparatorCheckBox; private JCheckBox hasFullBorderCheckBox; private JCheckBox tabIconsCheckBox; private JSpinner tabIconSizeSpinner; diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.jfd index 04bffb81..a68eed26 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatContainerTest.jfd @@ -131,7 +131,7 @@ new FormModel { } ) add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { "$layoutConstraints": "insets 0,hidemode 3" - "$columnConstraints": "[][][][][fill][fill]" + "$columnConstraints": "[][][][fill][][fill][fill]" "$rowConstraints": "[center]" } ) { name: "panel14" @@ -168,6 +168,16 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 2 0" } ) + add( new FormComponent( "javax.swing.JCheckBox" ) { + name: "hideContentSeparatorCheckBox" + "text": "Hide content separator" + auxiliary() { + "JavaCodeGenerator.variableLocal": false + } + addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "hideContentSeparatorChanged", false ) ) + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 0" + } ) add( new FormComponent( "javax.swing.JCheckBox" ) { name: "hasFullBorderCheckBox" "text": "Show content border" @@ -176,7 +186,7 @@ new FormModel { } addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "hasFullBorderChanged", false ) ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { - "value": "cell 3 0,alignx left,growx 0" + "value": "cell 4 0,alignx left,growx 0" } ) add( new FormComponent( "javax.swing.JCheckBox" ) { name: "tabIconsCheckBox" @@ -186,7 +196,7 @@ new FormModel { } addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "tabIconsChanged", false ) ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { - "value": "cell 4 0" + "value": "cell 5 0" } ) add( new FormComponent( "javax.swing.JSpinner" ) { name: "tabIconSizeSpinner" @@ -205,7 +215,7 @@ new FormModel { } addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "tabIconsChanged", false ) ) }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { - "value": "cell 5 0" + "value": "cell 6 0" } ) }, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) { "gridY": 11 @@ -216,7 +226,7 @@ new FormModel { } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) - "size": new java.awt.Dimension( 625, 515 ) + "size": new java.awt.Dimension( 810, 515 ) } ) add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { "$layoutConstraints": "hidemode 3,align center center"