From 3f3884193d0530f32e9b01c826811b4e94ed9ac1 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 8 Jan 2020 14:47:40 +0100 Subject: [PATCH] Button and TextComponent: support per component minimum width --- CHANGELOG.md | 2 ++ .../java/com/formdev/flatlaf/FlatClientProperties.java | 8 ++++++++ .../main/java/com/formdev/flatlaf/ui/FlatButtonUI.java | 2 +- .../java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java | 1 + .../java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java | 1 + .../src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java | 6 ++++++ .../com/formdev/flatlaf/testing/FlatComponentsTest.java | 2 ++ .../com/formdev/flatlaf/testing/FlatComponentsTest.jfd | 2 ++ 12 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fdb69bc..e9120fb5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ FlatLaf Change Log `JButton.buttonType` to `square`). - ToggleButton: Support underline toggle button style (set client property `JButton.buttonType` to `underline`). +- Button and TextComponent: Support per component minimum width (set client + property `JComponent.minimumWidth` to an integer). ## 0.23.1 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 8048c6d0..d6952d0e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -76,6 +76,14 @@ public interface FlatClientProperties */ String SELECTED_STATE_INDETERMINATE = "indeterminate"; + /** + * Specifies minimum width of a component. + *

+ * Component {@link javax.swing.JButton} and {@link javax.swing.text.JTextComponent}
+ * Value type {@link java.lang.Integer}
+ */ + String MINIMUM_WIDTH = "JComponent.minimumWidth"; + /** * Specifies whether the decrease/increase arrow buttons of a scrollbar are shown. *

diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index f1b41324..dd9cd90b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -363,7 +363,7 @@ public class FlatButtonUI if( isIconOnlyButton( c ) ) prefSize.width = Math.max( prefSize.width, prefSize.height ); else if( !isToolBarButton( c ) ) - prefSize.width = Math.max( prefSize.width, scale( minimumWidth + (focusWidth * 2) ) ); + prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) + (focusWidth * 2) ) ); return prefSize; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java index 75dfde0f..0bfe034b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java @@ -98,6 +98,7 @@ public class FlatEditorPaneUI // and subtract 1px border line width. // Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + int minimumWidth = FlatUIUtils.minimumWidth( getComponent(), this.minimumWidth ); size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); return size; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java index 0894bc46..40fe9586 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java @@ -147,6 +147,7 @@ public class FlatPasswordFieldUI } private Dimension applyMinimumWidth( Dimension size, JComponent c ) { + int minimumWidth = FlatUIUtils.minimumWidth( getComponent(), this.minimumWidth ); int focusWidth = (c.getBorder() instanceof FlatBorder) ? this.focusWidth : 0; size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) ); return size; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index f64ce2b3..8c0e20ee 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -326,6 +326,7 @@ public class FlatSpinnerUI Dimension editorSize = (editor != null) ? editor.getPreferredSize() : new Dimension( 0, 0 ); // the arrows width is the same as the inner height so that the arrows area is square + int minimumWidth = FlatUIUtils.minimumWidth( spinner, FlatSpinnerUI.this.minimumWidth ); int innerHeight = editorSize.height + padding.top + padding.bottom; return new Dimension( Math.max( insets.left + insets.right + editorSize.width + padding.left + padding.right + innerHeight, scale( minimumWidth + (focusWidth * 2) ) ), diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java index a7d2ffb7..4cc5c109 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java @@ -117,6 +117,7 @@ public class FlatTextAreaUI // and subtract 1px border line width. // Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + int minimumWidth = FlatUIUtils.minimumWidth( getComponent(), this.minimumWidth ); size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); return size; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java index d74dabf1..47f97005 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java @@ -217,6 +217,7 @@ public class FlatTextFieldUI (parent != null && parent.getParent() instanceof JSpinner) ) return size; + int minimumWidth = FlatUIUtils.minimumWidth( getComponent(), this.minimumWidth ); int focusWidth = (c.getBorder() instanceof FlatBorder) ? this.focusWidth : 0; size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) ); return size; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java index dc3a196c..b6c70926 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java @@ -98,6 +98,7 @@ public class FlatTextPaneUI // and subtract 1px border line width. // Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + int minimumWidth = FlatUIUtils.minimumWidth( getComponent(), this.minimumWidth ); size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); return size; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index 13f8d2d3..b12af8e1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -38,6 +38,7 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.util.DerivedColor; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; @@ -111,6 +112,11 @@ public class FlatUIUtils return (c instanceof ColorUIResource) ? new Color( c.getRGB(), true ) : c; } + public static int minimumWidth( JComponent c, int minimumWidth ) { + Object p = c.getClientProperty( FlatClientProperties.MINIMUM_WIDTH ); + return (p instanceof Integer) ? ((Integer)p).intValue() : minimumWidth; + } + public static boolean isTableCellEditor( Component c ) { return c instanceof JComponent && Boolean.TRUE.equals( ((JComponent)c).getClientProperty( "JComboBox.isTableCellEditor" ) ); } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java index 0dac7e91..e7c1c58a 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.java @@ -258,6 +258,7 @@ public class FlatComponentsTest //---- button17 ---- button17.setText("square"); button17.putClientProperty("JButton.buttonType", "square"); + button17.putClientProperty("JComponent.minimumWidth", 0); add(button17, "cell 1 1"); //---- button2 ---- @@ -271,6 +272,7 @@ public class FlatComponentsTest button18.setText("square"); button18.putClientProperty("JButton.buttonType", "square"); button18.setEnabled(false); + button18.putClientProperty("JComponent.minimumWidth", 0); add(button18, "cell 2 1"); //---- button5 ---- diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd index 9f358bfb..61ac0eeb 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponentsTest.jfd @@ -51,6 +51,7 @@ new FormModel { name: "button17" "text": "square" "$client.JButton.buttonType": "square" + "$client.JComponent.minimumWidth": 0 }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 1 1" } ) @@ -68,6 +69,7 @@ new FormModel { "text": "square" "$client.JButton.buttonType": "square" "enabled": false + "$client.JComponent.minimumWidth": 0 }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 2 1" } )