From b517f648846bfd0e11fe081a8d70fc4b232ef4ee Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 10 Sep 2019 23:46:48 +0200 Subject: [PATCH] HelpButton added --- .../formdev/flatlaf/FlatClientProperties.java | 36 +++++ .../flatlaf/icons/FlatHelpButtonIcon.java | 123 ++++++++++++++++++ .../formdev/flatlaf/ui/FlatButtonBorder.java | 2 +- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 28 ++++ .../com/formdev/flatlaf/FlatLaf.properties | 12 ++ .../formdev/flatlaf/FlatLightLaf.properties | 5 + .../formdev/flatlaf/FlatComponentsTest.java | 13 ++ .../formdev/flatlaf/FlatComponentsTest.jfd | 15 +++ .../formdev/flatlaf/FlatTestLaf.properties | 5 + flatlaf-core/svg/FlatLaf Icons.sketch | Bin 15567 -> 17382 bytes flatlaf-core/svg/HelpButtonIcon.svg | 7 + .../flatlaf/demo/BasicComponentsPanel.java | 13 ++ .../flatlaf/demo/BasicComponentsPanel.jfd | 15 +++ 13 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java create mode 100644 flatlaf-core/svg/HelpButtonIcon.svg diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java new file mode 100644 index 00000000..c59e5bd1 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -0,0 +1,36 @@ +/* + * Copyright 2019 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf; + +import java.util.Objects; +import javax.swing.JComponent; + +/** + * @author Karl Tauber + */ +public interface FlatClientProperties +{ + String BUTTON_TYPE = "JButton.buttonType"; + String BUTTON_TYPE_HELP = "help"; + + /** + * Checks whether a client property of a component has the given value. + */ + static boolean clientPropertyEquals( JComponent c, String key, Object value ) { + return Objects.equals( c.getClientProperty( key ), value ); + } +} diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java new file mode 100644 index 00000000..f53a5e25 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -0,0 +1,123 @@ +/* + * Copyright 2019 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.icons; + +import static com.formdev.flatlaf.util.UIScale.*; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics2D; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Path2D; +import javax.swing.UIManager; + +/** + * Help button icon for {@link javax.swing.JButton}. + * + * @uiDefault Component.focusWidth int + * @uiDefault Component.focusColor Color + * @uiDefault HelpButton.borderColor Color + * @uiDefault HelpButton.disabledBorderColor Color + * @uiDefault HelpButton.focusedBorderColor Color + * @uiDefault HelpButton.background Color + * @uiDefault HelpButton.disabledBackground Color + * @uiDefault HelpButton.questionMarkColor Color + * @uiDefault HelpButton.disabledQuestionMarkColor Color + * + * @author Karl Tauber + */ +public class FlatHelpButtonIcon + extends FlatAbstractIcon +{ + protected final int focusWidth = UIManager.getInt( "Component.focusWidth" ); + protected final Color focusColor = UIManager.getColor( "Component.focusColor" ); + + protected final Color borderColor = UIManager.getColor( "HelpButton.borderColor" ); + protected final Color disabledBorderColor = UIManager.getColor( "HelpButton.disabledBorderColor" ); + protected final Color focusedBorderColor = UIManager.getColor( "HelpButton.focusedBorderColor" ); + protected final Color background = UIManager.getColor( "HelpButton.background" ); + protected final Color disabledBackground = UIManager.getColor( "HelpButton.disabledBackground" ); + protected final Color questionMarkColor = UIManager.getColor( "HelpButton.questionMarkColor" ); + protected final Color disabledQuestionMarkColor = UIManager.getColor( "HelpButton.disabledQuestionMarkColor" ); + + protected final int iconSize = 22 + (focusWidth * 2); + + public FlatHelpButtonIcon() { + super( 0, 0, null ); + } + + @Override + protected void paintIcon( Component c, Graphics2D g2 ) { + /* + + + + + + + + */ + + boolean enabled = c.isEnabled(); + boolean focused = c.hasFocus(); + + // paint focused border + if( focused ) { + g2.setColor( focusColor ); + g2.fill( new Ellipse2D.Float( 0.5f, 0.5f, iconSize - 1, iconSize - 1 ) ); + } + + // paint border + g2.setColor( enabled + ? (focused ? focusedBorderColor : borderColor) + : disabledBorderColor ); + g2.fill( new Ellipse2D.Float( focusWidth + 0.5f, focusWidth + 0.5f, 21, 21 ) ); + + // paint background + g2.setColor( enabled + ? background + : disabledBackground ); + g2.fill( new Ellipse2D.Float( focusWidth + 1.5f, focusWidth + 1.5f, 19, 19 ) ); + + // paint question mark + Path2D q = new Path2D.Float(); + q.moveTo( 11, 5 ); + q.curveTo( 8.8,5, 7,6.8, 7,9 ); + q.lineTo( 9, 9 ); + q.curveTo( 9,7.9, 9.9,7, 11,7 ); + q.curveTo( 12.1,7, 13,7.9, 13,9 ); + q.curveTo( 13,11, 10,10.75, 10,14 ); + q.lineTo( 12, 14 ); + q.curveTo( 12,11.75, 15,11.5, 15,9 ); + q.curveTo( 15,6.8, 13.2,5, 11,5 ); + q.closePath(); + + g2.translate( focusWidth, focusWidth ); + g2.setColor( enabled ? questionMarkColor : disabledQuestionMarkColor ); + g2.fill( q ); + g2.fillRect( 10, 15, 2, 2 ); + } + + @Override + public int getIconWidth() { + return scale( iconSize ); + } + + @Override + public int getIconHeight() { + return scale( iconSize ); + } +} 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 cd0465b6..5af58fe3 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 @@ -54,7 +54,7 @@ public class FlatButtonBorder @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { - if( FlatButtonUI.isContentAreaFilled( c ) ) + if( FlatButtonUI.isContentAreaFilled( c ) && !FlatButtonUI.isHelpButton( 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 710cc0c7..7e2d2c89 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 @@ -16,15 +16,18 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.FlatClientProperties.*; import static com.formdev.flatlaf.util.UIScale.scale; import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.AbstractButton; import javax.swing.ButtonModel; +import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.UIManager; @@ -59,6 +62,8 @@ public class FlatButtonUI protected Color toolbarHoverBackground; protected Color toolbarPressedBackground; + private Icon helpButtonIcon; + private static ComponentUI instance; public static ComponentUI createUI( JComponent c ) { @@ -81,6 +86,8 @@ public class FlatButtonUI defaultForeground = UIManager.getColor( prefix + "default.foreground" ); toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" ); toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" ); + + helpButtonIcon = UIManager.getIcon( "HelpButton.icon" ); } static boolean isContentAreaFilled( Component c ) { @@ -91,8 +98,18 @@ public class FlatButtonUI return c instanceof JButton && ((JButton)c).isDefaultButton(); } + static boolean isHelpButton( Component c ) { + return c instanceof JButton && clientPropertyEquals( (JButton) c, BUTTON_TYPE, BUTTON_TYPE_HELP ); + } + @Override public void update( Graphics g, JComponent c ) { + if( isHelpButton( c ) ) { + FlatUIUtils.paintParentBackground( g, c ); + helpButtonIcon.paintIcon( c, g, 0, 0 ); + return; + } + if( c.isOpaque() && isContentAreaFilled( c ) ) { FlatUIUtils.paintParentBackground( g, c ); @@ -119,6 +136,9 @@ public class FlatButtonUI @Override protected void paintText( Graphics g, JComponent c, Rectangle textRect, String text ) { + if( isHelpButton( c ) ) + return; + AbstractButton b = (AbstractButton) c; FontMetrics fm = c.getFontMetrics( c.getFont() ); int mnemonicIndex = b.getDisplayedMnemonicIndex(); @@ -154,4 +174,12 @@ public class FlatButtonUI boolean def = isDefaultButton( c ); return def ? defaultForeground : c.getForeground(); } + + @Override + public Dimension getPreferredSize( JComponent c ) { + if( isHelpButton( c ) ) + return new Dimension( helpButtonIcon.getIconWidth(), helpButtonIcon.getIconHeight() ); + + return super.getPreferredSize( c ); + } } diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index 5b20e059..5d1e4606 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -141,6 +141,18 @@ FormattedTextField.background=@textComponentBackground FormattedTextField.margin=@textComponentMargin +#---- HelpButton ---- + +HelpButton.icon=com.formdev.flatlaf.icons.FlatHelpButtonIcon +HelpButton.borderColor=@@CheckBox.icon.borderColor +HelpButton.disabledBorderColor=@@CheckBox.icon.disabledBorderColor +HelpButton.focusedBorderColor=@@CheckBox.icon.focusedBorderColor +HelpButton.background=@@CheckBox.icon.background +HelpButton.disabledBackground=@@CheckBox.icon.disabledBackground +HelpButton.questionMarkColor=@@CheckBox.icon.checkmarkColor +HelpButton.disabledQuestionMarkColor=@@CheckBox.icon.disabledCheckmarkColor + + #---- List ---- List.border=1,0,1,0 diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index 89831614..cedb77bf 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -109,6 +109,11 @@ Component.focusedBorderColor=87afda Component.focusColor=97c3f3 +#---- HelpButton ---- + +HelpButton.questionMarkColor=4D89C9 + + #---- List ---- List.background=@textComponentBackground diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java index 32faaf75..52b7ff7c 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java @@ -53,6 +53,8 @@ public class FlatComponentsTest JButton button1 = new JButton(); JButton button2 = new JButton(); FlatComponentsTest.TestDefaultButton button5 = new FlatComponentsTest.TestDefaultButton(); + JButton button3 = new JButton(); + JButton button12 = new JButton(); JLabel toggleButtonLabel = new JLabel(); JToggleButton toggleButton1 = new JToggleButton(); JToggleButton toggleButton2 = new JToggleButton(); @@ -231,6 +233,17 @@ public class FlatComponentsTest button5.setDisplayedMnemonicIndex(0); add(button5, "cell 3 1"); + //---- button3 ---- + button3.setText("Help"); + button3.putClientProperty("JButton.buttonType", "help"); + add(button3, "cell 4 1"); + + //---- button12 ---- + button12.setText("Help"); + button12.putClientProperty("JButton.buttonType", "help"); + button12.setEnabled(false); + add(button12, "cell 4 1"); + //---- toggleButtonLabel ---- toggleButtonLabel.setText("JToggleButton:"); add(toggleButtonLabel, "cell 0 2"); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd index 9ca1f460..2296912e 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd @@ -61,6 +61,21 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 3 1" } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button3" + "text": "Help" + "$client.JButton.buttonType": "help" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 1" + } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button12" + "text": "Help" + "$client.JButton.buttonType": "help" + "enabled": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 1" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "toggleButtonLabel" "text": "JToggleButton:" diff --git a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties index fb1ea527..a19111d9 100644 --- a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties +++ b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties @@ -95,6 +95,11 @@ Component.focusColor=97c3f3 #Component.arc=8 +#---- HelpButton ---- + +HelpButton.questionMarkColor=0000ff + + #---- Label ---- Label.foreground=008800 diff --git a/flatlaf-core/svg/FlatLaf Icons.sketch b/flatlaf-core/svg/FlatLaf Icons.sketch index 29901de5540067c54f2530581dcae28b0222c243..ea8b14650aaaa14b982f7c5bccf546894016862c 100644 GIT binary patch delta 16459 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�(O-A z>Y)_dlF{77si?74yi6bq3D?W>ydXjV%L-g%5P}>RIMTLZVnc-cGjODwV_$GVf}L#w zD-ypwwhp$!Ip%p&lve-EjzWyosts$-$jndr9>ppmPtk@=6Km}PiuBv)m6E@D^fc+W zFzd>RiS3*pxrg%g{!}W4M=%nSpbDy8>`fta0TY@Ul`%+BCIM~`)F*;0IJkQ=D0(Q9 zL2*v>z^YL6D(K>lf2Lzz{Y1p7RW|Y@dJ**7K29Ed;;K`RWcOypV!kD1b6>a*BSmM65u`&q?WC3=X8lw(mBlT4ODTr`0u zYf3dMOU=`a5A^aNbP78o&+?+#M?+{sC;FYg5y<{s8(XgjzToAhz#%X|z(8O?KtKQx z5b;`tYickM5M^)>5ZHe%7bg=(dP^reThYWxOKm2EV7;P^2P*Xx+SP`{uM?6P(frK0 zA=b9v;EB>{WHao4I@DSsF*})aW1WBRKOKI0KRvecbh?968Vz4 zC%R6&-o1Ex@OtxCwS?-OAKrOtUIV(Z$0a6TE(Wp--$)NEAhg8;Xf=8@EgTqQdYdm& z_M~&hXJ{Gi3BfB(L-Imq`$yB+tu3iVxrCcE{R7)@QTu)`nHnzOgcuEQufZUOXgbm2 zB(3VGl{}Uqwvms(lu2dauv&oHX5_=5MR7?DqR|u|saw^F3j1?6f|vNqYXL}%2xj;g zC87?MQeyol(UD?1E0pT13)-CW*uT*T?!d5dDNtO$BSp!p<1XN%vPB;75x^@O;theA z;q{u_X`8nyoohBeSgtaWrdDmKHk#UgR~h|tAzD^^5low4q|oLJ54(18W`q(vcN~OL zAa;IGSPf)b{>FerONdPk%Lfk9h{q6QL}{lG2P70cQPR}W?Nedc+6uoHMa`H!klSiW zs4yiV6jOu8qV_dIvz`CxqOoGgoHul742p9YsKsDBhhoE+maso|af;v#uMzRSIFKck z-41Z+-PjoTEekCE8BI;ZFvXn4OAm;)L^(?v(C!~QT))ywSbuTm{t5I{K27jxyGb4K zwLY&{u*ywYBYfkHvJT)Rd!T6b2}); zS)E5To%;%{S?2%WiwXq9_Xh)x^uKyqhWhWCvN3Ts_^+DER-Ulk7ejeZ_A_f?x(>BV zETcyU%%MZ-zH&@asO$Sg18#)C<}1s}tFM+#c`u$e7dBYCBck2T$A?tU7RMcn)P!m< zwyn7;`s*&o&#D$DRh-OwmPjA*@JkkFVls`K?$$Vy>u(7KkFW)kONno?1oL-);$;`? zI_Yd*{m^+5z~;9HvtkfT8;L7C+G%yoYkl$q(on$eX2p+^;jh4cJ9oUcRRDtqfP2Q- zvjOk@WJ?7F&Imac&Wt*!FVFrlZuO~7 z@J5#GEJ$Kx+<=CmBK>3;U;n9hKEa#c(Pn)DV&NjeSTLyQ_E^E+L@C-}9He4?*Lm>) z`^4iY+0F7<@p)vLz4$2VqvWKUg7Q+zt^>O_w@}n#sF04}-`61|&19qSNdr2=Xhj7L zFehLBmJuFbqsP^bQySwM{=!UR!}O+s#3nUKGq$JcEW{uR-Blk^E@@sTFbgot4Z@&c z0ykk-CnqH~ul|mA%_0>nZ3O?S$g%VQutqVM<&v>+#4-BEzsGR1vo6N*CgbC3n zwi7%yA#_agGbu_=7`K6_#r;Iq2xOT8QN$Eg{mBxHrJg&ixgV3qe*CV#m!=V99d8<7 z0il;bQWGIFBqsZgSv9rKnPq`--qkWL*oy)K86J{^77w3*`zn9W6| zSulEpv&Q&B-7?Q#r&YEvK{`*wygRy|haNEF=-{i{@OoGgxU8hbm|=5Z!)Y?(@9}J57{6&gA&uEo7VMY&+wm%`)fQoh*40 z@%XcR73o97>#~JG?JkEm4z$8{S%x83P9-N|ZNR_wr!D-T|4lWJ|60F6K%xd3 z*cA{#K%@~937PRAq!Al#6M31jfKZr!+ygliinIH70d-Oo7XqoC!aoH8L4^7xBB<;R zda0vjO(2f*8SCU7zCYNeI6`5eu=!h15Ybj-P|6}akLj?O&rg7uZSOlOiVz7u22DgM zl}{cS9I-iMsf56fFahE`B!;do45{$UhzJzQut6LA64yk|?m<4j$K7|p%5*imp`qjJ z&(;*z7en^N)E^+zuA8O9%ynrjc^r&3NF*QiD!U=nx?ULZDBBLK5{LVvh2) zeDUA8Ov&#LYS@r);xPzdwiB(;H*$|8Rn2x$6Dx@NAu@>_sT(4an=1>kFbDMz-^#}C z;8R75OCdmIy=9s!ZDAuY?CM@;;ux`MgX>D`6^4vEuxNYpnYkAS-i*s(AzCDx+GU^2 zM9m38%F0hf+d4mQIZ8YLA?G((hG4H9EvA{svnR}GWysJ!`SD&yDO#y zk*5DY;K2VUJ`N|~WAC1GC$y*;Wppq`m27ERE_QX)*J8x;ZQ}r9n@l|X%|tH|-)eJ- zBF%|KUtApe{^3E;$jHd}L+vGXj6BR#lKEvCBP~JtfPq~&q8^Sozr^yXJklBHJiRu5lKVmeocuEw0eAk6}I{ZX^=9USbtjIvC-cjv^Q3A zutjQ-Q2F|v;jQ1UQXA_)u5p4TwG;~&6m_FWyo;Y8K_c3Oai7w+O+KS88zuMbWl0wx zX)APulA;ebCxMKY5}C~&8}x}wYZK9UPL2hH}z%18*i1x2w~i#$&<|Ur_NR0Vu=t2Mnp&>`3yi#QVgCrDug< zI4!aA5a&J_jP`U(yOzXR_ESx$g!KNTx zxu7S*s&WWt%ZjJ#pYG^#D5U@227&(pWxbDCa-N%yjj+Qh(*@hzEPicOq@xQ6zwDLW z-`d(5{VW#V_{{d$Z*vcpc_PJWyej_Pv$XbKaWIEK zBTXYtSw`%k(P|V_tXF0L8_#?%?Fj0T{J1*q+{;Ilav_a_=^MOo`FwwwG0%^#g}3=9 z&I%Kw2K>E9ZgY^M%@=_Q>DpcWQO7i?oF@V^{G^+Xdnb}u=PPh=oKUQvD+cm3bXK4k!gS4l{cmaW6z+-cY;oKfV}` zuJ{FjphpE@o+tdHQ~Y-$aJYZ$gVX%CAM}I$zXt>VztI2x!N7msI_|S1wm;Y)jhhRm z;R`olZ_!G=({(c2)@oT`B3moZ#tfNtvpGFM*tlI-?RY17_ZO#+3DmG@1S21d z-HYz_8VsK1UG08~YOC3u+AREtM(~L0aTZgM>v$)R7-q0_1PkRJ<*+0RKK2}~V7w4-WPn+$`N!?|N zOLun{dKQEfpYMDXWgqBYAfs%a<&Y|`XqBAoNQL~KaHi8AJfpE@UK0c@!Xy44aoe?9 z4V#U(w+laizK+9m{(X!}skpqh3?8{U4T`q$+<}Cg1U!9xU#7FU;N~fjwP=3068az6 zguX8%+eijX=5WEM#(rXBQj{bO8{no?SqDakcEi!FH-{)7SKVp8Fh56QG4u^uGc`u1 z8hS|)=CszpZ|QY=i&1M#PuJ8GwK=3c?-SIjtG7d1nrk9n=JG+enZAnb{$eCsF1qH0 zEh<>u0m5YuZaq$3P4$e)2KwICwnOq;)zQ93#k_>zzu$aL#>f9*=;`3m+*Q(29Vk|j znQ5yZ8}~A<2eI3t>dg(Q9w?g~U*$Y|59rOnSwU_Pmg`v1Y`zFw(vfRB>&Kvh2}vE| zAbOGA`Lp=3!9xFa%-^!Ck^;|}Xyf_5KAbAm30z!!Oa%9)pD%_sw<$jFFif|OJA#_k zoALQ({ykJo-flniaK8}Fo|&%`Lb{|uj*%TGWQgtM;n>u>D!p}ryrZJk_9C!-Z-SOA z5>>OJUk0fl#11mCx^i5E{zj8ReUmeBUw`rq!>7Pbsn3gkexg7P=>**;GeXUG!Vx5P z8(9A)K_3+jA)?dhAgTPq<>Q$>o%QYs*(Q$+8)~EMfQkUnoo&s8!bWv7g;ej!eB$?7dfjPLSL|CUjbyJ+JED9`oVXk434NJO zJ+SPEvMCit#p<)CCb4A-_m@I-i2Q|+3|wA4RXP@Z9BkM0P8>e8;{}VJ2Og^*W2}lb zmKlb*UhePF{>eIPm|XU)gP4jnuXP@8HyF}29}-=tJ=ZqK_Bu5{h!WL_8WJ7Y%5PSGV6b<{>yaIBrax zmf{fKIl_}0T^wgVW8dz^a-85v<}T>F`o{P9OVZhJcR%;H2xUr4bOZk_?{eOVWAF?| zH2Hhj{-2!z`HY$@710jwf8QJyAbms#nZ`^+%T|B3jwe|#fh)1Iq-|WR6Xbbsa(7pQ z{^@>U{D?-@&#{g+>8riJ+`r4PnJFj6<7E|r+>FF&I zKDlrl*(`r=#g8D@GoV?pAyTFcsC{Ux3P|g6|zd{i%;G-6<}_0P?Ha9N7pD7Da`rxZ zO3VM`yA}L*K9P^@s3yWNq`|xNpWw_c6mUyg91iVh2D%`<=+w(Y=2u5PNc-mXWiV}x zk?c|fwY#zoY7zM;L7gFSE$!#Q?9!w~Z`4G`LF@(5CCgDcefiE?Gz@wue!0OB5n0%F z;{v(+>>l7yw*+T}1$$|a{kV0A49eCiMoZdI-r6C1>IHV4K{84**OP~Y=EHrN_OjWY z-`^e;;b~_7UoM1C=EeL7?|the7ro#%#oK*D&h|!IZnEBz2QU3I?KbuRHGO~q_*MSM zq`w0EtH^e7fY*t`oz6l4-)u{nF4OZ6jyZl0wCDb-C7|J$w+Z*%7pO5>K#V8p)_)Ot6S@6Rx?6oU`#7N=ELfU2f4 zzc2H7)jId`49s)6)LI3>Ura9mI_*aYf@L{GkmxO>2KT@IF-+VPQo{c~)v|xh6$t2m49E|vL}_6>rTnu?A} + + + + + + diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java index 5cdeda20..a3da63eb 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.java @@ -37,6 +37,8 @@ class BasicComponentsPanel JLabel buttonLabel = new JLabel(); JButton button1 = new JButton(); JButton button2 = new JButton(); + JButton button3 = new JButton(); + JButton button4 = new JButton(); JLabel toggleButtonLabel = new JLabel(); JToggleButton toggleButton1 = new JToggleButton(); JToggleButton toggleButton2 = new JToggleButton(); @@ -161,6 +163,17 @@ class BasicComponentsPanel button2.setEnabled(false); add(button2, "cell 2 1"); + //---- button3 ---- + button3.setText("Help"); + button3.putClientProperty("JButton.buttonType", "help"); + add(button3, "cell 3 1"); + + //---- button4 ---- + button4.setText("Help"); + button4.putClientProperty("JButton.buttonType", "help"); + button4.setEnabled(false); + add(button4, "cell 4 1"); + //---- toggleButtonLabel ---- toggleButtonLabel.setText("JToggleButton:"); add(toggleButtonLabel, "cell 0 2"); diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd index e4a2aeab..6d200401 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/BasicComponentsPanel.jfd @@ -54,6 +54,21 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 2 1" } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button3" + "text": "Help" + "$client.JButton.buttonType": "help" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 1" + } ) + add( new FormComponent( "javax.swing.JButton" ) { + name: "button4" + "text": "Help" + "$client.JButton.buttonType": "help" + "enabled": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 1" + } ) add( new FormComponent( "javax.swing.JLabel" ) { name: "toggleButtonLabel" "text": "JToggleButton:"