From 0a8ece8c9c46d083b99449debb6527437110a8e7 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 4 Oct 2020 14:21:00 +0200 Subject: [PATCH] no longer use static fields for shared instances of UI delegates because this makes problems in GUI builders that support Laf switching and use more than one FlatLaf theme at the same time --- .../java/com/formdev/flatlaf/FlatLaf.java | 12 ++++++++++++ .../com/formdev/flatlaf/ui/FlatButtonUI.java | 6 +----- .../formdev/flatlaf/ui/FlatCheckBoxUI.java | 6 +----- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 6 +----- .../com/formdev/flatlaf/ui/FlatPanelUI.java | 6 +----- .../flatlaf/ui/FlatPopupMenuSeparatorUI.java | 6 +----- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 6 +----- .../formdev/flatlaf/ui/FlatSeparatorUI.java | 6 +----- .../flatlaf/ui/FlatToggleButtonUI.java | 6 +----- .../flatlaf/ui/FlatToolBarSeparatorUI.java | 6 +----- .../com/formdev/flatlaf/ui/FlatToolTipUI.java | 6 +----- .../com/formdev/flatlaf/ui/FlatUIUtils.java | 19 +++++++++++++++++++ .../formdev/flatlaf/ui/FlatViewportUI.java | 6 +----- 13 files changed, 42 insertions(+), 55 deletions(-) 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