mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-12 23:07:15 -06:00
Styling: support CheckBox and RadioButton (without icons)
This commit is contained in:
@@ -43,7 +43,16 @@ public class FlatCheckBoxUI
|
|||||||
extends FlatRadioButtonUI
|
extends FlatRadioButtonUI
|
||||||
{
|
{
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return FlatUIUtils.createSharedUI( FlatCheckBoxUI.class, FlatCheckBoxUI::new );
|
return FlatUIUtils.canUseSharedUI( c )
|
||||||
|
? FlatUIUtils.createSharedUI( FlatCheckBoxUI.class, () -> new FlatCheckBoxUI( true ) )
|
||||||
|
: new FlatCheckBoxUI( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected FlatCheckBoxUI( boolean shared ) {
|
||||||
|
super( shared );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import java.awt.Dimension;
|
|||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import javax.swing.CellRendererPane;
|
import javax.swing.CellRendererPane;
|
||||||
@@ -30,7 +32,9 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
|
import javax.swing.plaf.basic.BasicButtonListener;
|
||||||
import javax.swing.plaf.basic.BasicRadioButtonUI;
|
import javax.swing.plaf.basic.BasicRadioButtonUI;
|
||||||
|
import com.formdev.flatlaf.FlatClientProperties;
|
||||||
import com.formdev.flatlaf.icons.FlatCheckBoxIcon;
|
import com.formdev.flatlaf.icons.FlatCheckBoxIcon;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
|
|
||||||
@@ -62,10 +66,28 @@ public class FlatRadioButtonUI
|
|||||||
|
|
||||||
private Color defaultBackground;
|
private Color defaultBackground;
|
||||||
|
|
||||||
|
private final boolean shared;
|
||||||
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( FlatRadioButtonUI.class, FlatRadioButtonUI::new );
|
return FlatUIUtils.canUseSharedUI( c )
|
||||||
|
? FlatUIUtils.createSharedUI( FlatRadioButtonUI.class, () -> new FlatRadioButtonUI( true ) )
|
||||||
|
: new FlatRadioButtonUI( false );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected FlatRadioButtonUI( boolean shared ) {
|
||||||
|
this.shared = shared;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void installUI( JComponent c ) {
|
||||||
|
super.installUI( c );
|
||||||
|
|
||||||
|
applyStyle( FlatStyleSupport.getStyle( c ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -97,6 +119,56 @@ public class FlatRadioButtonUI
|
|||||||
defaults_initialized = false;
|
defaults_initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BasicButtonListener createButtonListener( AbstractButton b ) {
|
||||||
|
return new FlatRadioButtonListener( b );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) {
|
||||||
|
switch( e.getPropertyName() ) {
|
||||||
|
case FlatClientProperties.COMPONENT_STYLE:
|
||||||
|
applyStyle( b, this, e.getNewValue() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void applyStyle( AbstractButton b, FlatRadioButtonUI ui, Object style ) {
|
||||||
|
// unshare component UI if necessary
|
||||||
|
if( style != null && ui.shared ) {
|
||||||
|
b.updateUI();
|
||||||
|
ui = (FlatRadioButtonUI) b.getUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.applyStyle( style );
|
||||||
|
b.revalidate();
|
||||||
|
b.repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected void applyStyle( Object style ) {
|
||||||
|
oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected Object applyStyleProperty( String key, Object value ) {
|
||||||
|
Object oldValue;
|
||||||
|
switch( key ) {
|
||||||
|
case "disabledText": oldValue = disabledText; disabledText = (Color) value; break;
|
||||||
|
|
||||||
|
//TODO style icon
|
||||||
|
|
||||||
|
default: throw new IllegalArgumentException( "unknown style '" + key + "'" );
|
||||||
|
}
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
|
||||||
private static Insets tempInsets = new Insets( 0, 0, 0, 0 );
|
private static Insets tempInsets = new Insets( 0, 0, 0, 0 );
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -182,4 +254,26 @@ public class FlatRadioButtonUI
|
|||||||
? UIScale.scale( ((FlatCheckBoxIcon)getDefaultIcon()).focusWidth )
|
? UIScale.scale( ((FlatCheckBoxIcon)getDefaultIcon()).focusWidth )
|
||||||
: 0;
|
: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---- class FlatRadioButtonListener --------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since TODO
|
||||||
|
*/
|
||||||
|
protected class FlatRadioButtonListener
|
||||||
|
extends BasicButtonListener
|
||||||
|
{
|
||||||
|
private final AbstractButton b;
|
||||||
|
|
||||||
|
protected FlatRadioButtonListener( AbstractButton b ) {
|
||||||
|
super( b );
|
||||||
|
this.b = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void propertyChange( PropertyChangeEvent e ) {
|
||||||
|
super.propertyChange( e );
|
||||||
|
FlatRadioButtonUI.this.propertyChange( b, e );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public class FlatStyleSupport
|
|||||||
if( style == null || style.trim().isEmpty() )
|
if( style == null || style.trim().isEmpty() )
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Map<String, Object> map = new LinkedHashMap<>();
|
Map<String, Object> map = null;
|
||||||
|
|
||||||
// split style into parts and process them
|
// split style into parts and process them
|
||||||
for( String part : StringUtils.split( style, ';' ) ) {
|
for( String part : StringUtils.split( style, ';' ) ) {
|
||||||
@@ -131,6 +131,8 @@ public class FlatStyleSupport
|
|||||||
throw new IllegalArgumentException( "missing value in '" + part + "'" );
|
throw new IllegalArgumentException( "missing value in '" + part + "'" );
|
||||||
|
|
||||||
// parse value string and convert it into binary value
|
// parse value string and convert it into binary value
|
||||||
|
if( map == null )
|
||||||
|
map = new LinkedHashMap<>();
|
||||||
map.put( key, parseValue( key, value ) );
|
map.put( key, parseValue( key, value ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,10 +146,6 @@ public class FlatStyleSupport
|
|||||||
return FlatLaf.parseDefaultsValue( key, value );
|
return FlatLaf.parseDefaultsValue( key, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasStyle( JComponent c ) {
|
|
||||||
return getStyle( c ) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Object getStyle( JComponent c ) {
|
public static Object getStyle( JComponent c ) {
|
||||||
return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE );
|
return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -831,6 +831,14 @@ debug*/
|
|||||||
.computeIfAbsent( key, k -> newInstanceSupplier.get() );
|
.computeIfAbsent( key, k -> newInstanceSupplier.get() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the component UI for the given component can be shared
|
||||||
|
* with other components. This is only possible if it does not have styles.
|
||||||
|
*/
|
||||||
|
public static boolean canUseSharedUI( JComponent c ) {
|
||||||
|
return FlatStyleSupport.getStyle( c ) == null;
|
||||||
|
}
|
||||||
|
|
||||||
//---- class RepaintFocusListener -----------------------------------------
|
//---- class RepaintFocusListener -----------------------------------------
|
||||||
|
|
||||||
public static class RepaintFocusListener
|
public static class RepaintFocusListener
|
||||||
|
|||||||
Reference in New Issue
Block a user