From 3505d2dfd51829312521c2e9749ef81270cd4d3a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 11 Sep 2019 14:00:33 +0200 Subject: [PATCH] ScrollBar: hover support --- .../formdev/flatlaf/ui/FlatScrollBarUI.java | 100 +++++++++++++++++- .../formdev/flatlaf/FlatDarkLaf.properties | 4 +- .../formdev/flatlaf/FlatLightLaf.properties | 4 +- .../formdev/flatlaf/FlatTestLaf.properties | 2 + 4 files changed, 107 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 4212f2b5..48d80f36 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -16,11 +16,15 @@ package com.formdev.flatlaf.ui; +import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Rectangle; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollBarUI; import com.formdev.flatlaf.util.UIScale; @@ -28,15 +32,67 @@ import com.formdev.flatlaf.util.UIScale; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JScrollBar}. * + * @uiDefault ScrollBar.background Color + * @uiDefault ScrollBar.foreground Color + * @uiDefault ScrollBar.track Color + * @uiDefault ScrollBar.thumb Color + * @uiDefault ScrollBar.hoverTrackColor Color + * @uiDefault ScrollBar.hoverThumbColor Color + * @uiDefault ScrollBar.width int + * @uiDefault ScrollBar.minimumThumbSize Insets + * @uiDefault ScrollBar.maximumThumbSize Insets + * @uiDefault ScrollBar.allowsAbsolutePositioning boolean + * * @author Karl Tauber */ public class FlatScrollBarUI extends BasicScrollBarUI { + protected Color hoverTrackColor; + protected Color hoverThumbColor; + + private MouseAdapter hoverListener; + private boolean hoverTrack; + private boolean hoverThumb; + public static ComponentUI createUI( JComponent c ) { return new FlatScrollBarUI(); } + @Override + protected void installListeners() { + super.installListeners(); + + hoverListener = new ScrollBarHoverListener(); + scrollbar.addMouseListener( hoverListener ); + scrollbar.addMouseMotionListener( hoverListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + scrollbar.removeMouseListener( hoverListener ); + scrollbar.removeMouseMotionListener( hoverListener ); + hoverListener = null; + } + + @Override + protected void installDefaults() { + super.installDefaults(); + + hoverTrackColor = UIManager.getColor( "ScrollBar.hoverTrackColor" ); + hoverThumbColor = UIManager.getColor( "ScrollBar.hoverThumbColor" ); + } + + @Override + protected void uninstallDefaults() { + super.uninstallDefaults(); + + hoverTrackColor = null; + hoverThumbColor = null; + } + @Override public Dimension getPreferredSize( JComponent c ) { return UIScale.scale( super.getPreferredSize( c ) ); @@ -72,12 +128,18 @@ public class FlatScrollBarUI // do not paint } + @Override + protected void paintTrack( Graphics g, JComponent c, Rectangle trackBounds ) { + g.setColor( hoverTrack ? hoverTrackColor : trackColor ); + g.fillRect( trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height ); + } + @Override protected void paintThumb( Graphics g, JComponent c, Rectangle thumbBounds ) { if( thumbBounds.isEmpty() || !scrollbar.isEnabled() ) return; - g.setColor( thumbColor ); + g.setColor( hoverThumb ? hoverThumbColor : thumbColor ); g.fillRect( thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height ); } @@ -90,4 +152,40 @@ public class FlatScrollBarUI protected Dimension getMaximumThumbSize() { return UIScale.scale( super.getMaximumThumbSize() ); } + + //---- class ScrollBarHoverListener --------------------------------------- + + private class ScrollBarHoverListener + extends MouseAdapter + { + @Override + public void mouseEntered( MouseEvent e ) { + hoverTrack = true; + repaint(); + } + + @Override + public void mouseExited( MouseEvent e ) { + hoverTrack = hoverThumb = false; + repaint(); + } + + @Override + public void mouseMoved( MouseEvent e ) { + update( e.getX(), e.getY() ); + } + + private void update( int x, int y ) { + boolean inThumb = thumbRect.contains( x, y ); + if( inThumb != hoverThumb ) { + hoverThumb = inThumb; + repaint(); + } + } + + private void repaint() { + if( scrollbar.isEnabled() ) + scrollbar.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 8f96f7f7..ce9515fe 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -156,7 +156,9 @@ ProgressBar.selectionBackground=@foreground #---- ScrollBar ---- ScrollBar.track=3F4244 -ScrollBar.thumb=47A6A6A6 +ScrollBar.thumb=5B5E5F +ScrollBar.hoverTrackColor=434647 +ScrollBar.hoverThumbColor=666868 #---- Separator ---- 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 a6c88cda..0c99c5ba 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -161,7 +161,9 @@ ProgressBar.selectionBackground=@foreground #---- ScrollBar ---- ScrollBar.track=F5F5F5 -ScrollBar.thumb=33737373 +ScrollBar.thumb=DBDBDB +ScrollBar.hoverTrackColor=e6e6e6 +ScrollBar.hoverThumbColor=c6c6c6 #---- Separator ---- 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 9739eaab..6f3819eb 100644 --- a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties +++ b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties @@ -165,6 +165,8 @@ ProgressBar.cycleTime=10000 ScrollBar.track=88ff88 ScrollBar.thumb=33737373 +ScrollBar.hoverTrackColor=00ff00 +ScrollBar.hoverThumbColor=ff0000 #---- Separator ----