package magic.ui.widget.scrollbar; import java.awt.Color; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JScrollBar; import javax.swing.plaf.basic.BasicScrollBarUI; public class MScrollBarUI extends BasicScrollBarUI { // Various colors of a gray hue. public static final Color COLOR_A = new Color(234, 234, 234); private static final Color COLOR_B = new Color(100, 100, 100); private static final Color COLOR_C = new Color(150, 150, 150); private static final Color COLOR_D = new Color(182, 182, 182); private static final Color COLOR_E = new Color(218, 218, 218); private static final Color[] DEFAULT_COLORS = new Color[]{COLOR_A, COLOR_B, COLOR_C}; private static final Color[] ROLLOVER_COLORS = new Color[]{COLOR_A, COLOR_C, COLOR_C}; public static MScrollBarUI createUI(JComponent c) { return new MScrollBarUI(); } private void doPaintCustomThumb(Graphics2D g2d, JComponent c, Rectangle r) { JScrollBar sb = (JScrollBar) c; if(!sb.isEnabled()) { return; } final boolean isVertical = sb.getOrientation() == JScrollBar.VERTICAL; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); final Color[] colors = isThumbRollover() ? ROLLOVER_COLORS : DEFAULT_COLORS; // // fill paint gradient // final Point endPoint = isVertical ? new Point(r.width + r.width / 4, 0) : new Point(0, r.height); final GradientPaint fillPaint = new GradientPaint( 0, 0, colors[0], endPoint.x, endPoint.y, colors[1] ); // // shape // final int offset1 = 3; final int offset2 = 9; final Dimension offset = isVertical ? new Dimension(offset1, offset2) : new Dimension(offset2, offset1); final Rectangle rect = new Rectangle( r.x + offset.width, r.y + offset.height, r.width - (offset.width * 2), r.height - (offset.height * 2) ); g2d.setPaint(fillPaint); g2d.fillRoundRect(rect.x, rect.y, rect.width, rect.height, 10, 10); g2d.setColor(colors[2]); g2d.drawRoundRect(rect.x, rect.y, rect.width, rect.height, 10, 10); } @Override protected void paintThumb(Graphics g, JComponent c, Rectangle r) { Graphics2D g2d = (Graphics2D) g.create(); doPaintCustomThumb(g2d, c, r); g2d.dispose(); } private void doPaintTrack(Graphics2D g2d, JComponent c, Rectangle r) { g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); JScrollBar sb = (JScrollBar) c; final boolean isVertical = sb.getOrientation() == JScrollBar.VERTICAL; // // fill paint gradient // final Point endPoint1 = isVertical ? new Point(r.width + r.width / 2, 0) : new Point(0, r.height + r.height / 2); final GradientPaint fillPaint = new GradientPaint( 0, 0, COLOR_E, endPoint1.x, endPoint1.y, Color.WHITE ); // // shape // final Point endPoint2 = isVertical ? new Point(0, r.height) : new Point(r.width, 0); g2d.setPaint(fillPaint); g2d.fillRect(r.x, r.y, r.width, r.height); g2d.setColor(COLOR_D); g2d.drawLine(0, 0, endPoint2.x, endPoint2.y); } @Override protected void paintTrack(Graphics g, JComponent c, Rectangle r) { Graphics2D g2d = (Graphics2D) g.create(); doPaintTrack(g2d, c, r); g2d.dispose(); } @Override protected JButton createIncreaseButton(int orientation) { return new NoButton(); } @Override protected JButton createDecreaseButton(int orientation) { return new NoButton(); } @Override protected void setThumbBounds(int x, int y, int width, int height) { super.setThumbBounds(x, y, width, height); scrollbar.repaint(); } }