From ae8323e2f8bff8afb4ef30f0e84d3ded6886a391 Mon Sep 17 00:00:00 2001 From: Ingo Kegel Date: Mon, 22 Mar 2021 16:45:37 +0100 Subject: [PATCH] Added ButtonType.borderLess for buttons that look like toolbar buttons but have a focus indicator. This behavior can be achieved with JideButton, but it would be preferable to use FlatButton instead. --- .../com/formdev/flatlaf/FlatClientProperties.java | 12 +++++++++++- .../com/formdev/flatlaf/ui/FlatButtonBorder.java | 1 + .../java/com/formdev/flatlaf/ui/FlatButtonUI.java | 12 ++++++++---- .../flatlaf/extras/components/FlatButton.java | 2 +- .../flatlaf/testing/FlatComponentsTest.java | 13 +++++++++++++ .../flatlaf/testing/FlatComponentsTest.jfd | 15 +++++++++++++++ 6 files changed, 49 insertions(+), 6 deletions(-) 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 9e198fda..7c7235df 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -40,7 +40,8 @@ public interface FlatClientProperties * {@link #BUTTON_TYPE_ROUND_RECT}, * {@link #BUTTON_TYPE_TAB}, * {@link #BUTTON_TYPE_HELP} or - * {@link BUTTON_TYPE_TOOLBAR_BUTTON} + * {@link #BUTTON_TYPE_TOOLBAR_BUTTON} + * {@link #BUTTON_TYPE_BORDER_LESS} */ String BUTTON_TYPE = "JButton.buttonType"; @@ -89,6 +90,15 @@ public interface FlatClientProperties */ String BUTTON_TYPE_TOOLBAR_BUTTON = "toolBarButton"; + /** + * Paint the button without a border in the unfocused state. + *

+ * Components {@link javax.swing.JButton} and {@link javax.swing.JToggleButton} + * + * @see #BUTTON_TYPE + */ + String BUTTON_TYPE_BORDER_LESS = "borderLess"; + /** * Specifies selected state of a checkbox. *

diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java index 288b658a..677774f1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java @@ -75,6 +75,7 @@ public class FlatButtonBorder public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { if( FlatButtonUI.isContentAreaFilled( c ) && !FlatButtonUI.isToolBarButton( c ) && + ( !FlatButtonUI.isBorderLessButton( c ) || FlatUIUtils.isPermanentFocusOwner( c ) ) && !FlatButtonUI.isHelpButton( c ) && !FlatToggleButtonUI.isTabButton( c ) ) super.paintBorder( c, g, x, y, width, height ); 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 5aba716c..d145639b 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 @@ -285,6 +285,10 @@ public class FlatButtonUI (c instanceof AbstractButton && clientPropertyEquals( (AbstractButton) c, BUTTON_TYPE, BUTTON_TYPE_TOOLBAR_BUTTON )); } + static boolean isBorderLessButton( Component c ) { + return c instanceof AbstractButton && clientPropertyEquals( (AbstractButton) c, BUTTON_TYPE, BUTTON_TYPE_BORDER_LESS ); + } + @Override public void update( Graphics g, JComponent c ) { // fill background if opaque to avoid garbage if user sets opaque to true @@ -332,7 +336,7 @@ public class FlatButtonUI // paint shadow Color shadowColor = def ? defaultShadowColor : this.shadowColor; - if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && + if( !isToolBarButton && !isBorderLessButton( c ) && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) && c.isEnabled() ) { g2.setColor( shadowColor ); @@ -391,7 +395,7 @@ public class FlatButtonUI if( ((AbstractButton)c).isSelected() ) { // in toolbar use same colors for disabled and enabled because // we assume that toolbar icon is shown disabled - boolean toolBarButton = isToolBarButton( c ); + boolean toolBarButton = isToolBarButton( c ) || isBorderLessButton( c ); return buttonStateColor( c, toolBarButton ? toolbarSelectedBackground : selectedBackground, toolBarButton ? toolbarSelectedBackground : disabledSelectedBackground, @@ -403,7 +407,7 @@ public class FlatButtonUI return disabledBackground; // toolbar button - if( isToolBarButton( c ) ) { + if( isToolBarButton( c ) || isBorderLessButton( c ) ) { ButtonModel model = ((AbstractButton)c).getModel(); if( model.isPressed() ) return toolbarPressedBackground; @@ -465,7 +469,7 @@ public class FlatButtonUI if( !c.isEnabled() ) return disabledText; - if( ((AbstractButton)c).isSelected() && !isToolBarButton( c ) ) + if( ((AbstractButton)c).isSelected() && !( isToolBarButton( c ) || isBorderLessButton( c ) ) ) return selectedForeground; // use component foreground if explicitly set diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java index 63ede0b4..d2082470 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java @@ -30,7 +30,7 @@ public class FlatButton implements FlatComponentExtension { // NOTE: enum names must be equal to allowed strings - public enum ButtonType { none, square, roundRect, tab, help, toolBarButton }; + public enum ButtonType { none, square, roundRect, tab, help, toolBarButton, borderLess } /** * Returns type of a button. 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 d2c608c2..d52f266a 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 @@ -253,6 +253,7 @@ public class FlatComponentsTest JButton button16 = new JButton(); JButton button24 = new JButton(); JButton button20 = new JButton(); + JButton button25 = new JButton(); JLabel toggleButtonLabel = new JLabel(); JToggleButton toggleButton1 = new JToggleButton(); FlatToggleButton toggleButton9 = new FlatToggleButton(); @@ -268,6 +269,7 @@ public class FlatComponentsTest JToggleButton toggleButton14 = new JToggleButton(); JToggleButton toggleButton21 = new JToggleButton(); JToggleButton toggleButton18 = new JToggleButton(); + JToggleButton toggleButton22 = new JToggleButton(); JLabel checkBoxLabel = new JLabel(); JCheckBox checkBox1 = new JCheckBox(); JCheckBox checkBox2 = new JCheckBox(); @@ -578,6 +580,11 @@ public class FlatComponentsTest button20.setBorder(BorderFactory.createEmptyBorder()); add(button20, "cell 5 1 2 1"); + //---- button25 ---- + button25.setIcon(UIManager.getIcon("Tree.closedIcon")); + button25.putClientProperty("JButton.buttonType", "borderLess"); + add(button25, "cell 5 1 2 1"); + //---- toggleButtonLabel ---- toggleButtonLabel.setText("JToggleButton:"); add(toggleButtonLabel, "cell 0 2"); @@ -655,6 +662,12 @@ public class FlatComponentsTest toggleButton18.setBorder(BorderFactory.createEmptyBorder()); add(toggleButton18, "cell 5 2 2 1"); + //---- toggleButton22 ---- + toggleButton22.setIcon(UIManager.getIcon("Tree.closedIcon")); + toggleButton22.setSelected(true); + toggleButton22.putClientProperty("JButton.buttonType", "borderLess"); + add(toggleButton22, "cell 5 2 2 1"); + //---- checkBoxLabel ---- checkBoxLabel.setText("JCheckBox"); add(checkBoxLabel, "cell 0 3"); 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 c6ec4fae..9d8c6cfc 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 @@ -156,6 +156,13 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 5 1 2 1" } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button25" + "icon": &SwingIcon0 new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" ) + "$client.JButton.buttonType": "borderLess" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 1 2 1" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "toggleButtonLabel" "text": "JToggleButton:" @@ -263,6 +270,14 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 5 2 2 1" } ) + add( new FormComponent( "javax.swing.JToggleButton" ) { + name: "toggleButton22" + "icon": &SwingIcon0 new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" ) + "selected": true + "$client.JButton.buttonType": "borderLess" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 5 2 2 1" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "checkBoxLabel" "text": "JCheckBox"