diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index 28aba22a..546d5eeb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -700,6 +700,18 @@ public abstract class FlatLaf MnemonicHandler.showMnemonics( false, null ); } + // do not allow overriding to avoid issues in FlatUIUtils.createSharedUI() + @Override + public final boolean equals( Object obj ) { + return super.equals( obj ); + } + + // do not allow overriding to avoid issues in FlatUIUtils.createSharedUI() + @Override + public final int hashCode() { + return super.hashCode(); + } + //---- class ActiveFont --------------------------------------------------- private static class ActiveFont 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 ef3e0d7a..54b0fd3f 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 @@ -132,12 +132,8 @@ public class FlatButtonUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatButtonUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatButtonUI.class, FlatButtonUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java index 3d37473e..e545fa66 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java @@ -42,12 +42,8 @@ import javax.swing.plaf.ComponentUI; public class FlatCheckBoxUI extends FlatRadioButtonUI { - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatCheckBoxUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatCheckBoxUI.class, FlatCheckBoxUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index b26853b2..2bfafc52 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -56,12 +56,8 @@ public class FlatLabelUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatLabelUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatLabelUI.class, FlatLabelUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPanelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPanelUI.java index cc931df6..bbf15601 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPanelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPanelUI.java @@ -35,11 +35,7 @@ import javax.swing.plaf.basic.BasicPanelUI; public class FlatPanelUI extends BasicPanelUI { - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatPanelUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatPanelUI.class, FlatPanelUI::new ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java index 3bc8931b..a51fcd54 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java @@ -38,12 +38,8 @@ import javax.swing.plaf.ComponentUI; public class FlatPopupMenuSeparatorUI extends FlatSeparatorUI { - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatPopupMenuSeparatorUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatPopupMenuSeparatorUI.class, FlatPopupMenuSeparatorUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 7bde15d2..e1329a9c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -60,12 +60,8 @@ public class FlatRadioButtonUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatRadioButtonUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatRadioButtonUI.class, FlatRadioButtonUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 94031480..7ace822b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -52,12 +52,8 @@ public class FlatSeparatorUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatSeparatorUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatSeparatorUI.class, FlatSeparatorUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java index 37a2d551..22dedbdc 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java @@ -82,12 +82,8 @@ public class FlatToggleButtonUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatToggleButtonUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatToggleButtonUI.class, FlatToggleButtonUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index 8a1877fc..8d0fa657 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -50,12 +50,8 @@ public class FlatToolBarSeparatorUI private boolean defaults_initialized = false; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatToolBarSeparatorUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatToolBarSeparatorUI.class, FlatToolBarSeparatorUI::new ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolTipUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolTipUI.java index 679a461e..e900b966 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolTipUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolTipUI.java @@ -52,12 +52,8 @@ public class FlatToolTipUI { private static PropertyChangeListener sharedPropertyChangedListener; - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatToolTipUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatToolTipUI.class, FlatToolTipUI::new ); } @Override 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 6c706b24..fb35c064 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 @@ -35,7 +35,10 @@ import java.awt.event.MouseEvent; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; +import java.util.IdentityHashMap; +import java.util.WeakHashMap; import java.util.function.Consumer; +import java.util.function.Supplier; import javax.swing.JComponent; import javax.swing.JTable; import javax.swing.LookAndFeel; @@ -43,6 +46,7 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; +import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.util.DerivedColor; @@ -59,6 +63,8 @@ public class FlatUIUtils { public static final boolean MAC_USE_QUARTZ = Boolean.getBoolean( "apple.awt.graphics.UseQuartz" ); + private static WeakHashMap> sharedUIinstances = new WeakHashMap<>(); + public static Rectangle addInsets( Rectangle r, Insets insets ) { return new Rectangle( r.x - insets.left, @@ -534,6 +540,19 @@ public class FlatUIUtils return explicitlySet; } + /** + * Creates a shared component UI for the given key and the current Laf. + * Each Laf instance has its own shared component UI instance. + *

+ * This is for GUI builders that support Laf switching and + * may use multiple Laf instances at the same time. + */ + public static ComponentUI createSharedUI( Object key, Supplier newInstanceSupplier ) { + return sharedUIinstances + .computeIfAbsent( UIManager.getLookAndFeel(), k -> new IdentityHashMap<>() ) + .computeIfAbsent( key, k -> newInstanceSupplier.get() ); + } + //---- class HoverListener ------------------------------------------------ public static class HoverListener diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatViewportUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatViewportUI.java index c8953cfb..89167367 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatViewportUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatViewportUI.java @@ -38,12 +38,8 @@ import javax.swing.plaf.basic.BasicViewportUI; public class FlatViewportUI extends BasicViewportUI { - private static ComponentUI instance; - public static ComponentUI createUI( JComponent c ) { - if( instance == null ) - instance = new FlatViewportUI(); - return instance; + return FlatUIUtils.createSharedUI( FlatViewportUI.class, FlatViewportUI::new ); } @Override