mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-13 07:17:13 -06:00
Styling: support Button and ToggleButton (including border)
This commit is contained in:
@@ -70,25 +70,16 @@ public class FlatBorder
|
|||||||
@Styleable protected Color disabledBorderColor = UIManager.getColor( "Component.disabledBorderColor" );
|
@Styleable protected Color disabledBorderColor = UIManager.getColor( "Component.disabledBorderColor" );
|
||||||
@Styleable protected Color focusedBorderColor = UIManager.getColor( "Component.focusedBorderColor" );
|
@Styleable protected Color focusedBorderColor = UIManager.getColor( "Component.focusedBorderColor" );
|
||||||
|
|
||||||
protected Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" );
|
@Styleable(dot=true) protected Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" );
|
||||||
protected Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" );
|
@Styleable(dot=true) protected Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" );
|
||||||
protected Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" );
|
@Styleable(dot=true) protected Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" );
|
||||||
protected Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" );
|
@Styleable(dot=true) protected Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" );
|
||||||
protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" );
|
@Styleable(dot=true) protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since TODO
|
* @since TODO
|
||||||
*/
|
*/
|
||||||
public Object applyStyleProperty( String key, Object value ) {
|
public Object applyStyleProperty( String key, Object value ) {
|
||||||
Object oldValue;
|
|
||||||
switch( key ) {
|
|
||||||
case "error.borderColor": oldValue = errorBorderColor; errorBorderColor = (Color) value; return oldValue;
|
|
||||||
case "error.focusedBorderColor": oldValue = errorFocusedBorderColor; errorFocusedBorderColor = (Color) value; return oldValue;
|
|
||||||
case "warning.borderColor": oldValue = warningBorderColor; warningBorderColor = (Color) value; return oldValue;
|
|
||||||
case "warning.focusedBorderColor": oldValue = warningFocusedBorderColor; warningFocusedBorderColor = (Color) value; return oldValue;
|
|
||||||
case "custom.borderColor": oldValue = customBorderColor; customBorderColor = (Color) value; return oldValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FlatStyleSupport.applyToAnnotatedObject( this, key, value );
|
return FlatStyleSupport.applyToAnnotatedObject( this, key, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.awt.Paint;
|
|||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
|
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,9 +40,9 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault Button.default.borderColor Color
|
* @uiDefault Button.default.borderColor Color
|
||||||
* @uiDefault Button.default.startBorderColor Color optional; if set, a gradient paint is used and Button.default.borderColor is ignored
|
* @uiDefault Button.default.startBorderColor Color optional; if set, a gradient paint is used and Button.default.borderColor is ignored
|
||||||
* @uiDefault Button.default.endBorderColor Color optional; if set, a gradient paint is used
|
* @uiDefault Button.default.endBorderColor Color optional; if set, a gradient paint is used
|
||||||
* @uiDefault Button.default.hoverBorderColor Color optional
|
|
||||||
* @uiDefault Button.default.focusedBorderColor Color
|
* @uiDefault Button.default.focusedBorderColor Color
|
||||||
* @uiDefault Button.default.focusColor Color
|
* @uiDefault Button.default.focusColor Color
|
||||||
|
* @uiDefault Button.default.hoverBorderColor Color optional
|
||||||
* @uiDefault Button.borderWidth int
|
* @uiDefault Button.borderWidth int
|
||||||
* @uiDefault Button.default.borderWidth int
|
* @uiDefault Button.default.borderWidth int
|
||||||
* @uiDefault Button.innerFocusWidth int or float optional; defaults to Component.innerFocusWidth
|
* @uiDefault Button.innerFocusWidth int or float optional; defaults to Component.innerFocusWidth
|
||||||
@@ -54,22 +55,27 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
public class FlatButtonBorder
|
public class FlatButtonBorder
|
||||||
extends FlatBorder
|
extends FlatBorder
|
||||||
{
|
{
|
||||||
protected final Color borderColor = FlatUIUtils.getUIColor( "Button.startBorderColor", "Button.borderColor" );
|
@Styleable protected Color borderColor = FlatUIUtils.getUIColor( "Button.startBorderColor", "Button.borderColor" );
|
||||||
protected final Color endBorderColor = UIManager.getColor( "Button.endBorderColor" );
|
protected Color endBorderColor = UIManager.getColor( "Button.endBorderColor" );
|
||||||
protected final Color disabledBorderColor = UIManager.getColor( "Button.disabledBorderColor" );
|
@Styleable protected Color disabledBorderColor = UIManager.getColor( "Button.disabledBorderColor" );
|
||||||
protected final Color focusedBorderColor = UIManager.getColor( "Button.focusedBorderColor" );
|
@Styleable protected Color focusedBorderColor = UIManager.getColor( "Button.focusedBorderColor" );
|
||||||
protected final Color hoverBorderColor = UIManager.getColor( "Button.hoverBorderColor" );
|
@Styleable protected Color hoverBorderColor = UIManager.getColor( "Button.hoverBorderColor" );
|
||||||
protected final Color defaultBorderColor = FlatUIUtils.getUIColor( "Button.default.startBorderColor", "Button.default.borderColor" );
|
|
||||||
protected final Color defaultEndBorderColor = UIManager.getColor( "Button.default.endBorderColor" );
|
@Styleable(dot=true) protected Color defaultBorderColor = FlatUIUtils.getUIColor( "Button.default.startBorderColor", "Button.default.borderColor" );
|
||||||
protected final Color defaultHoverBorderColor = UIManager.getColor( "Button.default.hoverBorderColor" );
|
protected Color defaultEndBorderColor = UIManager.getColor( "Button.default.endBorderColor" );
|
||||||
protected final Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" );
|
@Styleable(dot=true) protected Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" );
|
||||||
protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
|
@Styleable(dot=true) protected Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" );
|
||||||
protected final int borderWidth = UIManager.getInt( "Button.borderWidth" );
|
@Styleable(dot=true) protected Color defaultHoverBorderColor = UIManager.getColor( "Button.default.hoverBorderColor" );
|
||||||
protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
|
|
||||||
protected final float buttonInnerFocusWidth = FlatUIUtils.getUIFloat( "Button.innerFocusWidth", innerFocusWidth );
|
@Styleable protected int borderWidth = UIManager.getInt( "Button.borderWidth" );
|
||||||
protected final Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" );
|
@Styleable(dot=true) protected int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" );
|
||||||
protected final Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
@Styleable(dot=true) protected Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" );
|
||||||
protected final int arc = UIManager.getInt( "Button.arc" );
|
@Styleable(dot=true) protected Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
||||||
|
@Styleable protected int arc = UIManager.getInt( "Button.arc" );
|
||||||
|
|
||||||
|
public FlatButtonBorder() {
|
||||||
|
innerFocusWidth = FlatUIUtils.getUIFloat( "Button.innerFocusWidth", innerFocusWidth );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) {
|
||||||
@@ -137,11 +143,6 @@ public class FlatButtonBorder
|
|||||||
return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth( c );
|
return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth( c );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected float getInnerFocusWidth( Component c ) {
|
|
||||||
return buttonInnerFocusWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getBorderWidth( Component c ) {
|
protected int getBorderWidth( Component c ) {
|
||||||
return FlatButtonUI.isDefaultButton( c ) ? defaultBorderWidth : borderWidth;
|
return FlatButtonUI.isDefaultButton( c ) ? defaultBorderWidth : borderWidth;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import java.awt.Insets;
|
|||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.util.Map;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.ButtonModel;
|
import javax.swing.ButtonModel;
|
||||||
import javax.swing.Icon;
|
import javax.swing.Icon;
|
||||||
@@ -39,11 +40,14 @@ import javax.swing.JToggleButton;
|
|||||||
import javax.swing.JToolBar;
|
import javax.swing.JToolBar;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.border.Border;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.UIResource;
|
import javax.swing.plaf.UIResource;
|
||||||
import javax.swing.plaf.basic.BasicButtonListener;
|
import javax.swing.plaf.basic.BasicButtonListener;
|
||||||
import javax.swing.plaf.basic.BasicButtonUI;
|
import javax.swing.plaf.basic.BasicButtonUI;
|
||||||
import com.formdev.flatlaf.FlatLaf;
|
import com.formdev.flatlaf.FlatLaf;
|
||||||
|
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
|
||||||
|
import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,7 +98,7 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
public class FlatButtonUI
|
public class FlatButtonUI
|
||||||
extends BasicButtonUI
|
extends BasicButtonUI
|
||||||
{
|
{
|
||||||
protected int minimumWidth;
|
@Styleable protected int minimumWidth;
|
||||||
protected int iconTextGap;
|
protected int iconTextGap;
|
||||||
|
|
||||||
protected Color background;
|
protected Color background;
|
||||||
@@ -102,38 +106,55 @@ public class FlatButtonUI
|
|||||||
|
|
||||||
protected Color startBackground;
|
protected Color startBackground;
|
||||||
protected Color endBackground;
|
protected Color endBackground;
|
||||||
protected Color focusedBackground;
|
@Styleable protected Color focusedBackground;
|
||||||
protected Color hoverBackground;
|
@Styleable protected Color hoverBackground;
|
||||||
protected Color pressedBackground;
|
@Styleable protected Color pressedBackground;
|
||||||
protected Color selectedBackground;
|
@Styleable protected Color selectedBackground;
|
||||||
protected Color selectedForeground;
|
@Styleable protected Color selectedForeground;
|
||||||
protected Color disabledBackground;
|
@Styleable protected Color disabledBackground;
|
||||||
protected Color disabledText;
|
@Styleable protected Color disabledText;
|
||||||
protected Color disabledSelectedBackground;
|
@Styleable protected Color disabledSelectedBackground;
|
||||||
|
|
||||||
protected Color defaultBackground;
|
@Styleable(dot=true) protected Color defaultBackground;
|
||||||
protected Color defaultEndBackground;
|
protected Color defaultEndBackground;
|
||||||
protected Color defaultForeground;
|
@Styleable(dot=true) protected Color defaultForeground;
|
||||||
protected Color defaultFocusedBackground;
|
@Styleable(dot=true) protected Color defaultFocusedBackground;
|
||||||
protected Color defaultHoverBackground;
|
@Styleable(dot=true) protected Color defaultHoverBackground;
|
||||||
protected Color defaultPressedBackground;
|
@Styleable(dot=true) protected Color defaultPressedBackground;
|
||||||
protected boolean defaultBoldText;
|
@Styleable(dot=true) protected boolean defaultBoldText;
|
||||||
|
|
||||||
protected int shadowWidth;
|
@Styleable protected boolean paintShadow;
|
||||||
protected Color shadowColor;
|
@Styleable protected int shadowWidth;
|
||||||
protected Color defaultShadowColor;
|
@Styleable protected Color shadowColor;
|
||||||
|
@Styleable(dot=true) protected Color defaultShadowColor;
|
||||||
|
|
||||||
protected Insets toolbarSpacingInsets;
|
@Styleable(dot=true) protected Insets toolbarSpacingInsets;
|
||||||
protected Color toolbarHoverBackground;
|
@Styleable(dot=true) protected Color toolbarHoverBackground;
|
||||||
protected Color toolbarPressedBackground;
|
@Styleable(dot=true) protected Color toolbarPressedBackground;
|
||||||
protected Color toolbarSelectedBackground;
|
@Styleable(dot=true) protected Color toolbarSelectedBackground;
|
||||||
|
|
||||||
private Icon helpButtonIcon;
|
private Icon helpButtonIcon;
|
||||||
|
|
||||||
|
private final boolean shared;
|
||||||
|
private boolean borderShared = true;
|
||||||
private boolean defaults_initialized = false;
|
private boolean defaults_initialized = false;
|
||||||
|
private Map<String, Object> oldStyleValues;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return FlatUIUtils.createSharedUI( FlatButtonUI.class, FlatButtonUI::new );
|
return FlatUIUtils.canUseSharedUI( c )
|
||||||
|
? FlatUIUtils.createSharedUI( FlatButtonUI.class, () -> new FlatButtonUI( true ) )
|
||||||
|
: new FlatButtonUI( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected FlatButtonUI( boolean shared ) {
|
||||||
|
this.shared = shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void installUI( JComponent c ) {
|
||||||
|
super.installUI( c );
|
||||||
|
|
||||||
|
applyStyle( (AbstractButton) c, FlatStyleSupport.getStyle( c ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -160,16 +181,6 @@ public class FlatButtonUI
|
|||||||
disabledText = UIManager.getColor( prefix + "disabledText" );
|
disabledText = UIManager.getColor( prefix + "disabledText" );
|
||||||
disabledSelectedBackground = UIManager.getColor( prefix + "disabledSelectedBackground" );
|
disabledSelectedBackground = UIManager.getColor( prefix + "disabledSelectedBackground" );
|
||||||
|
|
||||||
if( UIManager.getBoolean( "Button.paintShadow" ) ) {
|
|
||||||
shadowWidth = FlatUIUtils.getUIInt( "Button.shadowWidth", 2 );
|
|
||||||
shadowColor = UIManager.getColor( "Button.shadowColor" );
|
|
||||||
defaultShadowColor = UIManager.getColor( "Button.default.shadowColor" );
|
|
||||||
} else {
|
|
||||||
shadowWidth = 0;
|
|
||||||
shadowColor = null;
|
|
||||||
defaultShadowColor = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultBackground = FlatUIUtils.getUIColor( "Button.default.startBackground", "Button.default.background" );
|
defaultBackground = FlatUIUtils.getUIColor( "Button.default.startBackground", "Button.default.background" );
|
||||||
defaultEndBackground = UIManager.getColor( "Button.default.endBackground" );
|
defaultEndBackground = UIManager.getColor( "Button.default.endBackground" );
|
||||||
defaultForeground = UIManager.getColor( "Button.default.foreground" );
|
defaultForeground = UIManager.getColor( "Button.default.foreground" );
|
||||||
@@ -178,6 +189,11 @@ public class FlatButtonUI
|
|||||||
defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" );
|
defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" );
|
||||||
defaultBoldText = UIManager.getBoolean( "Button.default.boldText" );
|
defaultBoldText = UIManager.getBoolean( "Button.default.boldText" );
|
||||||
|
|
||||||
|
paintShadow = UIManager.getBoolean( "Button.paintShadow" );
|
||||||
|
shadowWidth = FlatUIUtils.getUIInt( "Button.shadowWidth", 2 );
|
||||||
|
shadowColor = UIManager.getColor( "Button.shadowColor" );
|
||||||
|
defaultShadowColor = UIManager.getColor( "Button.default.shadowColor" );
|
||||||
|
|
||||||
toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
|
||||||
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
|
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
|
||||||
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
|
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
|
||||||
@@ -225,6 +241,55 @@ public class FlatButtonUI
|
|||||||
b.revalidate();
|
b.revalidate();
|
||||||
b.repaint();
|
b.repaint();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case STYLE:
|
||||||
|
applyStyle( b, this, e.getNewValue() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void applyStyle( AbstractButton b, FlatButtonUI ui, Object style ) {
|
||||||
|
// unshare component UI if necessary
|
||||||
|
if( style != null && ui.shared ) {
|
||||||
|
b.updateUI();
|
||||||
|
ui = (FlatButtonUI) b.getUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.applyStyle( b, style );
|
||||||
|
b.revalidate();
|
||||||
|
b.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected void applyStyle( AbstractButton b, Object style ) {
|
||||||
|
oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style,
|
||||||
|
(key, value) -> applyStyleProperty( b, key, value ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected Object applyStyleProperty( AbstractButton b, String key, Object value ) {
|
||||||
|
try {
|
||||||
|
return FlatStyleSupport.applyToAnnotatedObject( this, key, value );
|
||||||
|
} catch( UnknownStyleException ex ) {
|
||||||
|
Border border = b.getBorder();
|
||||||
|
if( border instanceof FlatBorder ) {
|
||||||
|
if( borderShared ) {
|
||||||
|
border = FlatStyleSupport.cloneBorder( border );
|
||||||
|
b.setBorder( border );
|
||||||
|
borderShared = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return ((FlatBorder)border).applyStyleProperty( key, value );
|
||||||
|
} catch( UnknownStyleException ex2 ) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +401,8 @@ public class FlatButtonUI
|
|||||||
|
|
||||||
// paint shadow
|
// paint shadow
|
||||||
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
Color shadowColor = def ? defaultShadowColor : this.shadowColor;
|
||||||
if( shadowColor != null && shadowWidth > 0 && focusWidth > 0 && c.isEnabled() &&
|
if( paintShadow &&
|
||||||
|
shadowColor != null && shadowWidth > 0 && focusWidth > 0 && c.isEnabled() &&
|
||||||
!isToolBarButton && !isBorderlessButton( c ) &&
|
!isToolBarButton && !isBorderlessButton( c ) &&
|
||||||
!(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) )
|
!(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public class FlatStyleSupport
|
|||||||
@Target(ElementType.FIELD)
|
@Target(ElementType.FIELD)
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface Styleable {
|
public @interface Styleable {
|
||||||
|
boolean dot() default false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -180,14 +181,24 @@ public class FlatStyleSupport
|
|||||||
public static Object applyToAnnotatedObject( Object obj, String key, Object value )
|
public static Object applyToAnnotatedObject( Object obj, String key, Object value )
|
||||||
throws UnknownStyleException, IllegalArgumentException
|
throws UnknownStyleException, IllegalArgumentException
|
||||||
{
|
{
|
||||||
|
String fieldName = key;
|
||||||
|
int dotIndex = key.indexOf( '.' );
|
||||||
|
if( dotIndex >= 0 ) {
|
||||||
|
// remove first dot in key and change subsequent character to uppercase
|
||||||
|
fieldName = key.substring( 0, dotIndex )
|
||||||
|
+ Character.toUpperCase( key.charAt( dotIndex + 1 ) )
|
||||||
|
+ key.substring( dotIndex + 2 );
|
||||||
|
}
|
||||||
|
|
||||||
Class<?> cls = obj.getClass();
|
Class<?> cls = obj.getClass();
|
||||||
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
try {
|
try {
|
||||||
Field f = cls.getDeclaredField( key );
|
Field f = cls.getDeclaredField( fieldName );
|
||||||
if( f.isAnnotationPresent( Styleable.class ) ) {
|
Styleable styleable = f.getAnnotation( Styleable.class );
|
||||||
|
if( styleable != null && styleable.dot() == (dotIndex >= 0) ) {
|
||||||
if( Modifier.isFinal( f.getModifiers() ) )
|
if( Modifier.isFinal( f.getModifiers() ) )
|
||||||
throw new IllegalArgumentException( "field '" + cls.getName() + "." + key + "' is final" );
|
throw new IllegalArgumentException( "field '" + cls.getName() + "." + fieldName + "' is final" );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// necessary to access protected fields in other packages
|
// necessary to access protected fields in other packages
|
||||||
@@ -198,7 +209,7 @@ public class FlatStyleSupport
|
|||||||
f.set( obj, value );
|
f.set( obj, value );
|
||||||
return oldValue;
|
return oldValue;
|
||||||
} catch( IllegalAccessException ex ) {
|
} catch( IllegalAccessException ex ) {
|
||||||
throw new IllegalArgumentException( "failed to access field '" + cls.getName() + "." + key + "'" );
|
throw new IllegalArgumentException( "failed to access field '" + cls.getName() + "." + fieldName + "'" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch( NoSuchFieldException ex ) {
|
} catch( NoSuchFieldException ex ) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JToggleButton;
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,17 +74,23 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
public class FlatToggleButtonUI
|
public class FlatToggleButtonUI
|
||||||
extends FlatButtonUI
|
extends FlatButtonUI
|
||||||
{
|
{
|
||||||
protected int tabUnderlineHeight;
|
@Styleable(dot=true) protected int tabUnderlineHeight;
|
||||||
protected Color tabUnderlineColor;
|
@Styleable(dot=true) protected Color tabUnderlineColor;
|
||||||
protected Color tabDisabledUnderlineColor;
|
@Styleable(dot=true) protected Color tabDisabledUnderlineColor;
|
||||||
protected Color tabSelectedBackground;
|
@Styleable(dot=true) protected Color tabSelectedBackground;
|
||||||
protected Color tabHoverBackground;
|
@Styleable(dot=true) protected Color tabHoverBackground;
|
||||||
protected Color tabFocusBackground;
|
@Styleable(dot=true) protected Color tabFocusBackground;
|
||||||
|
|
||||||
private boolean defaults_initialized = false;
|
private boolean defaults_initialized = false;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return FlatUIUtils.createSharedUI( FlatToggleButtonUI.class, FlatToggleButtonUI::new );
|
return FlatUIUtils.canUseSharedUI( c )
|
||||||
|
? FlatUIUtils.createSharedUI( FlatToggleButtonUI.class, () -> new FlatToggleButtonUI( true ) )
|
||||||
|
: new FlatToggleButtonUI( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected FlatToggleButtonUI( boolean shared ) {
|
||||||
|
super( shared );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,9 +19,12 @@ package com.formdev.flatlaf.ui;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Insets;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import javax.swing.AbstractButton;
|
||||||
|
import javax.swing.JButton;
|
||||||
import javax.swing.JCheckBox;
|
import javax.swing.JCheckBox;
|
||||||
import javax.swing.JEditorPane;
|
import javax.swing.JEditorPane;
|
||||||
import javax.swing.JFormattedTextField;
|
import javax.swing.JFormattedTextField;
|
||||||
@@ -31,6 +34,7 @@ import javax.swing.JSplitPane;
|
|||||||
import javax.swing.JTextArea;
|
import javax.swing.JTextArea;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import javax.swing.JTextPane;
|
import javax.swing.JTextPane;
|
||||||
|
import javax.swing.JToggleButton;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import com.formdev.flatlaf.icons.FlatCapsLockIcon;
|
import com.formdev.flatlaf.icons.FlatCapsLockIcon;
|
||||||
@@ -70,6 +74,51 @@ public class FlatStylingTests
|
|||||||
|
|
||||||
//---- components ---------------------------------------------------------
|
//---- components ---------------------------------------------------------
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void button() {
|
||||||
|
FlatButtonUI ui = new FlatButtonUI( false );
|
||||||
|
|
||||||
|
// create border
|
||||||
|
UIManager.put( "Button.border", new FlatButtonBorder() );
|
||||||
|
JButton b = new JButton();
|
||||||
|
ui.installUI( b );
|
||||||
|
|
||||||
|
button( b, ui );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void button( AbstractButton b, FlatButtonUI ui ) {
|
||||||
|
ui.applyStyle( b, "minimumWidth: 100" );
|
||||||
|
|
||||||
|
ui.applyStyle( b, "focusedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "hoverBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "pressedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "selectedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "selectedForeground: #fff" );
|
||||||
|
ui.applyStyle( b, "disabledBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "disabledText: #fff" );
|
||||||
|
ui.applyStyle( b, "disabledSelectedBackground: #fff" );
|
||||||
|
|
||||||
|
ui.applyStyle( b, "default.background: #fff" );
|
||||||
|
ui.applyStyle( b, "default.foreground: #fff" );
|
||||||
|
ui.applyStyle( b, "default.focusedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "default.hoverBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "default.pressedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "default.boldText: true" );
|
||||||
|
|
||||||
|
ui.applyStyle( b, "paintShadow: true" );
|
||||||
|
ui.applyStyle( b, "shadowWidth: 2" );
|
||||||
|
ui.applyStyle( b, "shadowColor: #fff" );
|
||||||
|
ui.applyStyle( b, "default.shadowColor: #fff" );
|
||||||
|
|
||||||
|
ui.applyStyle( b, "toolbar.spacingInsets: 1,2,3,4" );
|
||||||
|
ui.applyStyle( b, "toolbar.hoverBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "toolbar.pressedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "toolbar.selectedBackground: #fff" );
|
||||||
|
|
||||||
|
// border
|
||||||
|
flatButtonBorder( style -> ui.applyStyle( b, style ) );
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void checkBox() {
|
void checkBox() {
|
||||||
FlatCheckBoxUI ui = new FlatCheckBoxUI( false );
|
FlatCheckBoxUI ui = new FlatCheckBoxUI( false );
|
||||||
@@ -332,8 +381,48 @@ public class FlatStylingTests
|
|||||||
ui.applyStyle( "focusedBackground: #fff" );
|
ui.applyStyle( "focusedBackground: #fff" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void toggleButton() {
|
||||||
|
FlatToggleButtonUI ui = new FlatToggleButtonUI( false );
|
||||||
|
|
||||||
|
// create border
|
||||||
|
UIManager.put( "ToggleButton.border", new FlatButtonBorder() );
|
||||||
|
JToggleButton b = new JToggleButton();
|
||||||
|
ui.installUI( b );
|
||||||
|
|
||||||
|
// FlatToggleButtonUI extends FlatButtonUI
|
||||||
|
button( b, ui );
|
||||||
|
|
||||||
|
ui.applyStyle( b, "tab.underlineHeight: 3" );
|
||||||
|
ui.applyStyle( b, "tab.underlineColor: #fff" );
|
||||||
|
ui.applyStyle( b, "tab.disabledUnderlineColor: #fff" );
|
||||||
|
ui.applyStyle( b, "tab.selectedBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "tab.hoverBackground: #fff" );
|
||||||
|
ui.applyStyle( b, "tab.focusBackground: #fff" );
|
||||||
|
}
|
||||||
|
|
||||||
//---- component borders --------------------------------------------------
|
//---- component borders --------------------------------------------------
|
||||||
|
|
||||||
|
private void flatButtonBorder( Consumer<String> applyStyle ) {
|
||||||
|
flatBorder( applyStyle );
|
||||||
|
|
||||||
|
applyStyle.accept( "borderColor: #fff" );
|
||||||
|
applyStyle.accept( "disabledBorderColor: #fff" );
|
||||||
|
applyStyle.accept( "focusedBorderColor: #fff" );
|
||||||
|
applyStyle.accept( "hoverBorderColor: #fff" );
|
||||||
|
|
||||||
|
applyStyle.accept( "default.borderColor: #fff" );
|
||||||
|
applyStyle.accept( "default.focusedBorderColor: #fff" );
|
||||||
|
applyStyle.accept( "default.focusColor: #fff" );
|
||||||
|
applyStyle.accept( "default.hoverBorderColor: #fff" );
|
||||||
|
|
||||||
|
applyStyle.accept( "borderWidth: 1" );
|
||||||
|
applyStyle.accept( "default.borderWidth: 2" );
|
||||||
|
applyStyle.accept( "toolbar.margin: 1,2,3,4" );
|
||||||
|
applyStyle.accept( "toolbar.spacingInsets: 1,2,3,4" );
|
||||||
|
applyStyle.accept( "arc: 6" );
|
||||||
|
}
|
||||||
|
|
||||||
private void flatTextBorder( Consumer<String> applyStyle ) {
|
private void flatTextBorder( Consumer<String> applyStyle ) {
|
||||||
flatBorder( applyStyle );
|
flatBorder( applyStyle );
|
||||||
|
|
||||||
@@ -358,6 +447,30 @@ public class FlatStylingTests
|
|||||||
|
|
||||||
//---- borders ------------------------------------------------------------
|
//---- borders ------------------------------------------------------------
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void flatButtonBorder() {
|
||||||
|
FlatButtonBorder border = new FlatButtonBorder();
|
||||||
|
|
||||||
|
// FlatButtonBorder extends FlatBorder
|
||||||
|
flatBorder( border );
|
||||||
|
|
||||||
|
border.applyStyleProperty( "borderColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "disabledBorderColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "focusedBorderColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "hoverBorderColor", Color.WHITE );
|
||||||
|
|
||||||
|
border.applyStyleProperty( "default.borderColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "default.focusedBorderColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "default.focusColor", Color.WHITE );
|
||||||
|
border.applyStyleProperty( "default.hoverBorderColor", Color.WHITE );
|
||||||
|
|
||||||
|
border.applyStyleProperty( "borderWidth", 1 );
|
||||||
|
border.applyStyleProperty( "default.borderWidth", 2 );
|
||||||
|
border.applyStyleProperty( "toolbar.margin", new Insets( 1, 2, 3, 4 ) );
|
||||||
|
border.applyStyleProperty( "toolbar.spacingInsets", new Insets( 1, 2, 3, 4 ) );
|
||||||
|
border.applyStyleProperty( "arc", 6 );
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void flatTextBorder() {
|
void flatTextBorder() {
|
||||||
FlatTextBorder border = new FlatTextBorder();
|
FlatTextBorder border = new FlatTextBorder();
|
||||||
|
|||||||
Reference in New Issue
Block a user