- hover feedback only when mouse is over thumb
- pressed feedback added
- separate disabled colors for track and thumb
- made private fields protected
This commit is contained in:
Karl Tauber
2020-11-17 14:03:26 +01:00
parent 8ee1d26935
commit 6e55e0a183
8 changed files with 127 additions and 55 deletions

View File

@@ -20,7 +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.event.MouseEvent;
import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JComponent;
@@ -53,25 +53,29 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Slider.trackColor Color
* @uiDefault Slider.thumbColor Color
* @uiDefault Slider.focusedColor Color optional; defaults to Component.focusColor
* @uiDefault Slider.hoverColor Color optional; defaults to Slider.focusedColor
* @uiDefault Slider.disabledForeground Color used for track and thumb is disabled
* @uiDefault Slider.hoverThumbColor Color optional
* @uiDefault Slider.pressedThumbColor Color optional
* @uiDefault Slider.disabledTrackColor Color
* @uiDefault Slider.disabledThumbColor Color
*
* @author Karl Tauber
*/
public class FlatSliderUI
extends BasicSliderUI
{
private int trackWidth;
private int thumbWidth;
protected int trackWidth;
protected int thumbWidth;
private Color trackColor;
private Color thumbColor;
private Color focusColor;
private Color hoverColor;
private Color disabledForeground;
protected Color trackColor;
protected Color thumbColor;
protected Color focusColor;
protected Color hoverThumbColor;
protected Color pressedThumbColor;
protected Color disabledTrackColor;
protected Color disabledThumbColor;
private MouseListener hoverListener;
private boolean hover;
protected boolean thumbHover;
protected boolean thumbPressed;
public static ComponentUI createUI( JComponent c ) {
return new FlatSliderUI();
@@ -81,24 +85,6 @@ 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 );
@@ -111,8 +97,10 @@ public class FlatSliderUI
trackColor = UIManager.getColor( "Slider.trackColor" );
thumbColor = UIManager.getColor( "Slider.thumbColor" );
focusColor = FlatUIUtils.getUIColor( "Slider.focusedColor", "Component.focusColor" );
hoverColor = FlatUIUtils.getUIColor( "Slider.hoverColor", focusColor );
disabledForeground = UIManager.getColor( "Slider.disabledForeground" );
hoverThumbColor = UIManager.getColor( "Slider.hoverThumbColor" );
pressedThumbColor = UIManager.getColor( "Slider.pressedThumbColor" );
disabledTrackColor = UIManager.getColor( "Slider.disabledTrackColor" );
disabledThumbColor = UIManager.getColor( "Slider.disabledThumbColor" );
}
@Override
@@ -122,8 +110,15 @@ public class FlatSliderUI
trackColor = null;
thumbColor = null;
focusColor = null;
hoverColor = null;
disabledForeground = null;
hoverThumbColor = null;
pressedThumbColor = null;
disabledTrackColor = null;
disabledThumbColor = null;
}
@Override
protected TrackListener createTrackListener( JSlider slider ) {
return new FlatTrackListener();
}
@Override
@@ -201,20 +196,17 @@ public class FlatSliderUI
}
if( coloredTrack != null ) {
g.setColor( FlatUIUtils.deriveColor( FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor), thumbColor ) );
g.setColor( thumbColor );
((Graphics2D)g).fill( coloredTrack );
}
g.setColor( enabled ? trackColor : disabledForeground );
g.setColor( enabled ? trackColor : disabledTrackColor );
((Graphics2D)g).fill( track );
}
@Override
public void paintThumb( Graphics g ) {
g.setColor( FlatUIUtils.deriveColor( slider.isEnabled()
? (FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor))
: disabledForeground,
thumbColor ) );
g.setColor( FlatUIUtils.deriveColor( getThumbColor(), thumbColor ) );
if( isRoundThumb() )
g.fillOval( thumbRect.x, thumbRect.y, thumbRect.width, thumbRect.height );
@@ -244,7 +236,73 @@ public class FlatSliderUI
}
}
private boolean isRoundThumb() {
protected Color getThumbColor() {
if( !slider.isEnabled() )
return disabledThumbColor;
if( thumbPressed && pressedThumbColor != null )
return pressedThumbColor;
if( thumbHover && hoverThumbColor != null )
return hoverThumbColor;
if( FlatUIUtils.isPermanentFocusOwner( slider ) )
return focusColor;
return thumbColor;
}
protected boolean isRoundThumb() {
return !slider.getPaintTicks() && !slider.getPaintLabels();
}
//---- class FlatTrackListener --------------------------------------------
protected class FlatTrackListener
extends TrackListener
{
@Override
public void mouseEntered( MouseEvent e ) {
setThumbHover( isOverThumb( e ) );
super.mouseEntered( e );
}
@Override
public void mouseExited( MouseEvent e ) {
setThumbHover( false );
super.mouseExited( e );
}
@Override
public void mouseMoved( MouseEvent e ) {
setThumbHover( isOverThumb( e ) );
super.mouseMoved( e );
}
@Override
public void mousePressed( MouseEvent e ) {
setThumbPressed( isOverThumb( e ) );
super.mousePressed( e );
}
@Override
public void mouseReleased( MouseEvent e ) {
setThumbPressed( false );
super.mouseReleased( e );
}
protected void setThumbHover( boolean hover ) {
if( hover != thumbHover ) {
thumbHover = hover;
slider.repaint( thumbRect );
}
}
protected void setThumbPressed( boolean pressed ) {
if( pressed != thumbPressed ) {
thumbPressed = pressed;
slider.repaint( thumbRect );
}
}
protected boolean isOverThumb( MouseEvent e ) {
return e != null && slider.isEnabled() && thumbRect.contains( e.getX(), e.getY() );
}
}
}

View File

@@ -240,8 +240,10 @@ Separator.foreground=#515151
Slider.trackColor=#646464
Slider.thumbColor=#A6A6A6
Slider.tickColor=#888
Slider.hoverColor=darken($Slider.thumbColor,15%,derived)
Slider.disabledForeground=#4c5052
Slider.hoverThumbColor=darken($Slider.thumbColor,10%,derived)
Slider.pressedThumbColor=darken($Slider.thumbColor,15%,derived)
Slider.disabledTrackColor=#4c5052
Slider.disabledThumbColor=$Slider.disabledTrackColor
#---- SplitPane ----

View File

@@ -252,8 +252,10 @@ Separator.foreground=#d1d1d1
Slider.trackColor=#c4c4c4
Slider.thumbColor=#6e6e6e
Slider.tickColor=#888
Slider.hoverColor=lighten($Slider.thumbColor,15%,derived)
Slider.disabledForeground=#c0c0c0
Slider.hoverThumbColor=lighten($Slider.thumbColor,10%,derived)
Slider.pressedThumbColor=lighten($Slider.thumbColor,15%,derived)
Slider.disabledTrackColor=#c0c0c0
Slider.disabledThumbColor=$Slider.disabledTrackColor
#---- SplitPane ----

View File

@@ -841,17 +841,19 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI
#---- Slider ----
Slider.background #3c3f41 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledForeground #4c5052 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledThumbColor #4c5052 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledTrackColor #4c5052 javax.swing.plaf.ColorUIResource [UI]
Slider.focus #7e7e7e javax.swing.plaf.ColorUIResource [UI]
Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
Slider.font [active] $defaultFont [UI]
Slider.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
Slider.highlight #242424 javax.swing.plaf.ColorUIResource [UI]
Slider.horizontalSize 200,21 java.awt.Dimension
Slider.hoverColor #808080 com.formdev.flatlaf.util.DerivedColor [UI] darken(15% autoInverse)
Slider.hoverThumbColor #8d8d8d com.formdev.flatlaf.util.DerivedColor [UI] darken(10% autoInverse)
Slider.minimumHorizontalSize 36,21 java.awt.Dimension
Slider.minimumVerticalSize 21,36 java.awt.Dimension
Slider.onlyLeftMouseButtonDrag true
Slider.pressedThumbColor #808080 com.formdev.flatlaf.util.DerivedColor [UI] darken(15% autoInverse)
Slider.shadow #646464 javax.swing.plaf.ColorUIResource [UI]
Slider.thumbColor #a6a6a6 javax.swing.plaf.ColorUIResource [UI]
Slider.thumbWidth 11

View File

@@ -846,17 +846,19 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI
#---- Slider ----
Slider.background #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledForeground #c0c0c0 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledThumbColor #c0c0c0 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledTrackColor #c0c0c0 javax.swing.plaf.ColorUIResource [UI]
Slider.focus #9e9e9e javax.swing.plaf.ColorUIResource [UI]
Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
Slider.font [active] $defaultFont [UI]
Slider.foreground #000000 javax.swing.plaf.ColorUIResource [UI]
Slider.highlight #ffffff javax.swing.plaf.ColorUIResource [UI]
Slider.horizontalSize 200,21 java.awt.Dimension
Slider.hoverColor #949494 com.formdev.flatlaf.util.DerivedColor [UI] lighten(15% autoInverse)
Slider.hoverThumbColor #888888 com.formdev.flatlaf.util.DerivedColor [UI] lighten(10% autoInverse)
Slider.minimumHorizontalSize 36,21 java.awt.Dimension
Slider.minimumVerticalSize 21,36 java.awt.Dimension
Slider.onlyLeftMouseButtonDrag true
Slider.pressedThumbColor #949494 com.formdev.flatlaf.util.DerivedColor [UI] lighten(15% autoInverse)
Slider.shadow #c4c4c4 javax.swing.plaf.ColorUIResource [UI]
Slider.thumbColor #6e6e6e javax.swing.plaf.ColorUIResource [UI]
Slider.thumbWidth 11

View File

@@ -833,7 +833,8 @@ SeparatorUI com.formdev.flatlaf.ui.FlatSeparatorUI
#---- Slider ----
Slider.background #ccffcc javax.swing.plaf.ColorUIResource [UI]
Slider.disabledForeground #000088 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledThumbColor #888800 javax.swing.plaf.ColorUIResource [UI]
Slider.disabledTrackColor #ffff88 javax.swing.plaf.ColorUIResource [UI]
Slider.focus #696969 javax.swing.plaf.ColorUIResource [UI]
Slider.focusInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
Slider.focusedColor #97c3f3 javax.swing.plaf.ColorUIResource [UI]
@@ -841,10 +842,11 @@ Slider.font [active] $defaultFont [UI]
Slider.foreground #ff0000 javax.swing.plaf.ColorUIResource [UI]
Slider.highlight #ffffff javax.swing.plaf.ColorUIResource [UI]
Slider.horizontalSize 200,21 java.awt.Dimension
Slider.hoverColor #0000ff javax.swing.plaf.ColorUIResource [UI]
Slider.hoverThumbColor #0000ff javax.swing.plaf.ColorUIResource [UI]
Slider.minimumHorizontalSize 36,21 java.awt.Dimension
Slider.minimumVerticalSize 21,36 java.awt.Dimension
Slider.onlyLeftMouseButtonDrag true
Slider.pressedThumbColor #00ff00 javax.swing.plaf.ColorUIResource [UI]
Slider.shadow #a0a0a0 javax.swing.plaf.ColorUIResource [UI]
Slider.thumbColor #880000 javax.swing.plaf.ColorUIResource [UI]
Slider.thumbWidth 11

View File

@@ -261,8 +261,10 @@ Slider.trackColor=#0b0
Slider.thumbColor=#800
Slider.tickColor=#f00
Slider.focusedColor=$Component.focusColor
Slider.hoverColor=#00f
Slider.disabledForeground=#008
Slider.hoverThumbColor=#00f
Slider.pressedThumbColor=#0f0
Slider.disabledTrackColor=#ff8
Slider.disabledThumbColor=#880
#---- SplitPane ----

View File

@@ -581,7 +581,8 @@ Separator.stripeIndent
Separator.stripeWidth
SeparatorUI
Slider.background
Slider.disabledForeground
Slider.disabledThumbColor
Slider.disabledTrackColor
Slider.focus
Slider.focusInputMap
Slider.focusInputMap.RightToLeft
@@ -590,10 +591,11 @@ Slider.font
Slider.foreground
Slider.highlight
Slider.horizontalSize
Slider.hoverColor
Slider.hoverThumbColor
Slider.minimumHorizontalSize
Slider.minimumVerticalSize
Slider.onlyLeftMouseButtonDrag
Slider.pressedThumbColor
Slider.shadow
Slider.thumbColor
Slider.thumbWidth