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.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 );

View File

@@ -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<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.thumbColor=A6A6A6
Slider.tickColor=888888
Slider.focusedColor=@@Component.focusColor
Slider.disabledForeground=4c5052

View File

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

View File

@@ -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