From 78d94885c5c179ed39bad6a735f4424683bab29a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 11 Sep 2019 12:02:55 +0200 Subject: [PATCH] Slider: hover support --- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 40 ++++++++++++++++--- .../com/formdev/flatlaf/ui/FlatUIUtils.java | 39 ++++++++++++++++++ .../formdev/flatlaf/FlatDarkLaf.properties | 1 + .../formdev/flatlaf/FlatLightLaf.properties | 1 + .../formdev/flatlaf/FlatTestLaf.properties | 2 + 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index db72e2d9..3732cbab 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -20,6 +20,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.event.MouseListener; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import javax.swing.JComponent; @@ -39,13 +40,14 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Slider.trackColor Color * @uiDefault Slider.thumbColor Color * @uiDefault Slider.tickColor Color + * @uiDefault Slider.focusedColor Color + * @uiDefault Slider.hoverColor Color optional; defaults to Slider.focusedColor * @uiDefault Slider.trackWidth int * @uiDefault Slider.thumbWidth int * @uiDefault Slider.horizontalSize Dimension preferred horizontal size; height is ignored; computed slider height is used * @uiDefault Slider.verticalSize Dimension preferred vertical size; width is ignored; computed slider width is used * @uiDefault Slider.minimumHorizontalSize Dimension height is ignored; computed slider height is used * @uiDefault Slider.minimumVerticalSize Dimension width is ignored; computed slider width is used - * @uiDefault Component.focusColor Color * * @author Karl Tauber */ @@ -57,8 +59,12 @@ public class FlatSliderUI private Color trackColor; private Color thumbColor; - private Color disabledForeground; private Color focusColor; + private Color hoverColor; + private Color disabledForeground; + + private MouseListener hoverListener; + private boolean hover; public static ComponentUI createUI( JComponent c ) { return new FlatSliderUI(); @@ -68,6 +74,24 @@ public class FlatSliderUI super( null ); } + @Override + protected void installListeners( JSlider slider ) { + super.installListeners( slider ); + + hoverListener = new FlatUIUtils.HoverListener( slider, h -> { + hover = h; + } ); + slider.addMouseListener( hoverListener ); + } + + @Override + protected void uninstallListeners( JSlider slider ) { + super.uninstallListeners( slider ); + + slider.removeMouseListener( hoverListener ); + hoverListener = null; + } + @Override protected void installDefaults( JSlider slider ) { super.installDefaults( slider ); @@ -77,8 +101,9 @@ public class FlatSliderUI trackColor = UIManager.getColor( "Slider.trackColor" ); thumbColor = UIManager.getColor( "Slider.thumbColor" ); + focusColor = UIManager.getColor( "Slider.focusedColor" ); + hoverColor = FlatUIUtils.getUIColor( "Slider.hoverColor", focusColor ); disabledForeground = UIManager.getColor( "Slider.disabledForeground" ); - focusColor = UIManager.getColor( "Component.focusColor" ); } @Override @@ -87,8 +112,9 @@ public class FlatSliderUI trackColor = null; thumbColor = null; - disabledForeground = null; focusColor = null; + hoverColor = null; + disabledForeground = null; } @Override @@ -160,7 +186,7 @@ public class FlatSliderUI } if( coloredTrack != null ) { - g.setColor( slider.hasFocus() ? focusColor : thumbColor ); + g.setColor( hover ? hoverColor : (slider.hasFocus() ? focusColor : thumbColor) ); ((Graphics2D)g).fill( coloredTrack ); } @@ -170,7 +196,9 @@ public class FlatSliderUI @Override public void paintThumb( Graphics g ) { - g.setColor( slider.hasFocus() ? focusColor : (slider.isEnabled() ? thumbColor : disabledForeground) ); + g.setColor( slider.isEnabled() + ? (hover ? hoverColor : (slider.hasFocus() ? focusColor : thumbColor)) + : disabledForeground ); if( isRoundThumb() ) g.fillOval( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height ); 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 4c555745..057996b6 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 @@ -23,8 +23,11 @@ import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; +import java.util.function.Consumer; import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; @@ -53,6 +56,11 @@ public class FlatUIUtils return (color != null) ? color : new Color( defaultColorRGB ); } + public static Color getUIColor( String key, Color defaultColor ) { + Color color = UIManager.getColor( key ); + return (color != null) ? color : defaultColor; + } + public static int getUIInt( String key, int defaultValue ) { Object value = UIManager.get( key ); return (value instanceof Integer) ? (Integer) value : defaultValue; @@ -180,4 +188,35 @@ public class FlatUIUtils { JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y ); } + + //---- class HoverListener ------------------------------------------------ + + public static class HoverListener + extends MouseAdapter + { + private final JComponent repaintComponent; + private final Consumer hoverChanged; + + public HoverListener( JComponent repaintComponent, Consumer hoverChanged ) { + this.repaintComponent = repaintComponent; + this.hoverChanged = hoverChanged; + } + + @Override + public void mouseEntered( MouseEvent e ) { + hoverChanged.accept( true ); + repaint(); + } + + @Override + public void mouseExited( MouseEvent e ) { + hoverChanged.accept( false ); + repaint(); + } + + private void repaint() { + if( repaintComponent != null && repaintComponent.isEnabled() ) + repaintComponent.repaint(); + } + } } diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index d15ef18c..8f96f7f7 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -169,6 +169,7 @@ Separator.foreground=515151 Slider.trackColor=646464 Slider.thumbColor=A6A6A6 Slider.tickColor=888888 +Slider.focusedColor=@@Component.focusColor Slider.disabledForeground=4c5052 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 cedb77bf..a6c88cda 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -174,6 +174,7 @@ Separator.foreground=cdcdcd Slider.trackColor=c4c4c4 Slider.thumbColor=6e6e6e Slider.tickColor=888888 +Slider.focusedColor=@@Component.focusColor Slider.disabledForeground=c0c0c0 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 a19111d9..9739eaab 100644 --- a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties +++ b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties @@ -180,6 +180,8 @@ Separator.stripeIndent=5 Slider.trackColor=00bb00 Slider.thumbColor=880000 Slider.tickColor=ff0000 +Slider.focusedColor=@@Component.focusColor +Slider.hoverColor=0000ff Slider.disabledForeground=000088