Slider: hover support

This commit is contained in:
Karl Tauber
2019-09-11 12:02:55 +02:00
parent c02c6ae36e
commit 78d94885c5
5 changed files with 77 additions and 6 deletions

View File

@@ -20,6 +20,7 @@ import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.event.MouseListener;
import java.awt.geom.Path2D; import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D; import java.awt.geom.RoundRectangle2D;
import javax.swing.JComponent; import javax.swing.JComponent;
@@ -39,13 +40,14 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Slider.trackColor Color * @uiDefault Slider.trackColor Color
* @uiDefault Slider.thumbColor Color * @uiDefault Slider.thumbColor Color
* @uiDefault Slider.tickColor Color * @uiDefault Slider.tickColor Color
* @uiDefault Slider.focusedColor Color
* @uiDefault Slider.hoverColor Color optional; defaults to Slider.focusedColor
* @uiDefault Slider.trackWidth int * @uiDefault Slider.trackWidth int
* @uiDefault Slider.thumbWidth int * @uiDefault Slider.thumbWidth int
* @uiDefault Slider.horizontalSize Dimension preferred horizontal size; height is ignored; computed slider height is used * @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.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.minimumHorizontalSize Dimension height is ignored; computed slider height is used
* @uiDefault Slider.minimumVerticalSize Dimension width is ignored; computed slider width is used * @uiDefault Slider.minimumVerticalSize Dimension width is ignored; computed slider width is used
* @uiDefault Component.focusColor Color
* *
* @author Karl Tauber * @author Karl Tauber
*/ */
@@ -57,8 +59,12 @@ public class FlatSliderUI
private Color trackColor; private Color trackColor;
private Color thumbColor; private Color thumbColor;
private Color disabledForeground;
private Color focusColor; private Color focusColor;
private Color hoverColor;
private Color disabledForeground;
private MouseListener hoverListener;
private boolean hover;
public static ComponentUI createUI( JComponent c ) { public static ComponentUI createUI( JComponent c ) {
return new FlatSliderUI(); return new FlatSliderUI();
@@ -68,6 +74,24 @@ public class FlatSliderUI
super( null ); 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 @Override
protected void installDefaults( JSlider slider ) { protected void installDefaults( JSlider slider ) {
super.installDefaults( slider ); super.installDefaults( slider );
@@ -77,8 +101,9 @@ public class FlatSliderUI
trackColor = UIManager.getColor( "Slider.trackColor" ); trackColor = UIManager.getColor( "Slider.trackColor" );
thumbColor = UIManager.getColor( "Slider.thumbColor" ); thumbColor = UIManager.getColor( "Slider.thumbColor" );
focusColor = UIManager.getColor( "Slider.focusedColor" );
hoverColor = FlatUIUtils.getUIColor( "Slider.hoverColor", focusColor );
disabledForeground = UIManager.getColor( "Slider.disabledForeground" ); disabledForeground = UIManager.getColor( "Slider.disabledForeground" );
focusColor = UIManager.getColor( "Component.focusColor" );
} }
@Override @Override
@@ -87,8 +112,9 @@ public class FlatSliderUI
trackColor = null; trackColor = null;
thumbColor = null; thumbColor = null;
disabledForeground = null;
focusColor = null; focusColor = null;
hoverColor = null;
disabledForeground = null;
} }
@Override @Override
@@ -160,7 +186,7 @@ public class FlatSliderUI
} }
if( coloredTrack != null ) { if( coloredTrack != null ) {
g.setColor( slider.hasFocus() ? focusColor : thumbColor ); g.setColor( hover ? hoverColor : (slider.hasFocus() ? focusColor : thumbColor) );
((Graphics2D)g).fill( coloredTrack ); ((Graphics2D)g).fill( coloredTrack );
} }
@@ -170,7 +196,9 @@ public class FlatSliderUI
@Override @Override
public void paintThumb( Graphics g ) { 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() ) if( isRoundThumb() )
g.fillOval( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height ); g.fillOval( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height );

View File

@@ -23,8 +23,11 @@ import java.awt.Graphics2D;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D; import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D; import java.awt.geom.RoundRectangle2D;
import java.util.function.Consumer;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ColorUIResource;
@@ -53,6 +56,11 @@ public class FlatUIUtils
return (color != null) ? color : new Color( defaultColorRGB ); 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 ) { public static int getUIInt( String key, int defaultValue ) {
Object value = UIManager.get( key ); Object value = UIManager.get( key );
return (value instanceof Integer) ? (Integer) value : defaultValue; return (value instanceof Integer) ? (Integer) value : defaultValue;
@@ -180,4 +188,35 @@ public class FlatUIUtils
{ {
JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y ); JavaCompatibility.drawStringUnderlineCharAt( c, g, text, underlinedIndex, x, y );
} }
//---- class HoverListener ------------------------------------------------
public static class HoverListener
extends MouseAdapter
{
private final JComponent repaintComponent;
private final Consumer<Boolean> hoverChanged;
public HoverListener( JComponent repaintComponent, Consumer<Boolean> 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();
}
}
} }

View File

@@ -169,6 +169,7 @@ Separator.foreground=515151
Slider.trackColor=646464 Slider.trackColor=646464
Slider.thumbColor=A6A6A6 Slider.thumbColor=A6A6A6
Slider.tickColor=888888 Slider.tickColor=888888
Slider.focusedColor=@@Component.focusColor
Slider.disabledForeground=4c5052 Slider.disabledForeground=4c5052

View File

@@ -174,6 +174,7 @@ Separator.foreground=cdcdcd
Slider.trackColor=c4c4c4 Slider.trackColor=c4c4c4
Slider.thumbColor=6e6e6e Slider.thumbColor=6e6e6e
Slider.tickColor=888888 Slider.tickColor=888888
Slider.focusedColor=@@Component.focusColor
Slider.disabledForeground=c0c0c0 Slider.disabledForeground=c0c0c0

View File

@@ -180,6 +180,8 @@ Separator.stripeIndent=5
Slider.trackColor=00bb00 Slider.trackColor=00bb00
Slider.thumbColor=880000 Slider.thumbColor=880000
Slider.tickColor=ff0000 Slider.tickColor=ff0000
Slider.focusedColor=@@Component.focusColor
Slider.hoverColor=0000ff
Slider.disabledForeground=000088 Slider.disabledForeground=000088