zoukankan      html  css  js  c++  java
  • Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法

    Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法

    摘自:https://blog.csdn.net/qq_31635851/article/details/80986870

    1.自定义BasicScrollBarUI类
      1 import java.awt.AlphaComposite;
      2 import java.awt.Color;
      3 import java.awt.Dimension;
      4 import java.awt.GradientPaint;
      5 import java.awt.Graphics;
      6 import java.awt.Graphics2D;
      7 import java.awt.Rectangle;
      8 import java.awt.RenderingHints;
      9 
     10 
     11 import javax.swing.ImageIcon;
     12 import javax.swing.JButton;
     13 import javax.swing.JComponent;
     14 import javax.swing.JScrollBar;
     15 import javax.swing.plaf.basic.BasicScrollBarUI;
     16 
     17 
     18 
     19 /**
     20 
     21  * 自定义滚动条UI
     22 
     23  *
     24 
     25  * @author zsg
     26 
     27  */
     28 
     29 public class DemoScrollBarUI extends BasicScrollBarUI {
     30 
     31     @Override
     32     protected void configureScrollBarColors() {
     33 
     34         // 把手
     35 
     36         // thumbColor = Color.GRAY;
     37 
     38         // thumbHighlightColor = Color.BLUE;
     39 
     40         // thumbDarkShadowColor = Color.BLACK;
     41 
     42         // thumbLightShadowColor = Color.YELLOW;
     43 
     44         // 滑道
     45 
     46         trackColor = Color.black;
     47 
     48         setThumbBounds(0, 0, 3, 10);
     49 
     50         // trackHighlightColor = Color.GREEN;
     51 
     52     }
     53 
     54     /**
     55 
     56      * 设置滚动条的宽度
     57 
     58      */
     59 
     60     @Override
     61     public Dimension getPreferredSize(JComponent c) {
     62 
     63         // TODO Auto-generated method stub
     64 
     65         c.setPreferredSize(new Dimension(40, 0));
     66 
     67         return super.getPreferredSize(c);
     68 
     69     }
     70 
     71 
     72     // 重绘滑块的滑动区域背景
     73 
     74     public void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
     75 
     76         Graphics2D g2 = (Graphics2D) g;
     77 
     78         GradientPaint gp = null;
     79 
     80         //判断滚动条是垂直的 还是水平的
     81 
     82         if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL) {
     83 
     84             //设置画笔
     85 
     86             gp = new GradientPaint(0, 0, new Color(80, 80, 80),
     87 
     88                     trackBounds.width, 0, new Color(80, 80, 80));
     89 
     90         }
     91 
     92         if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL) {
     93 
     94             gp = new GradientPaint(0, 0, new Color(80, 80, 80),
     95 
     96                     trackBounds.height, 0, new Color(80, 80, 80));
     97 
     98         }
     99 
    100 
    101         g2.setPaint(gp);
    102 
    103         //填充Track
    104 
    105         g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width,
    106 
    107                 trackBounds.height);
    108 
    109         //绘制Track的边框
    110         /*       g2.setColor(new Color(175, 155, 95));
    111          g2.drawRect(trackBounds.x, trackBounds.y, trackBounds.width - 1,
    112                 trackBounds.height - 1);
    113                 */
    114 
    115         if (trackHighlight == BasicScrollBarUI.DECREASE_HIGHLIGHT)
    116 
    117             this.paintDecreaseHighlight(g);
    118 
    119         if (trackHighlight == BasicScrollBarUI.INCREASE_HIGHLIGHT)
    120 
    121             this.paintIncreaseHighlight(g);
    122 
    123     }
    124 
    125 
    126     @Override
    127     protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
    128 
    129         // 把绘制区的x,y点坐标定义为坐标系的原点
    130 
    131         // 这句一定一定要加上啊,不然拖动就失效了
    132 
    133         g.translate(thumbBounds.x, thumbBounds.y);
    134 
    135         // 设置把手颜色
    136 
    137         g.setColor(new Color(   230,230,250));
    138 
    139         // 画一个圆角矩形
    140 
    141         // 这里面前四个参数就不多讲了,坐标和宽高
    142 
    143         // 后两个参数需要注意一下,是用来控制角落的圆角弧度
    144 
    145         // g.drawRoundRect(0, 0, 5, thumbBounds.height - 1, 5, 5);
    146 
    147         // 消除锯齿
    148 
    149         Graphics2D g2 = (Graphics2D) g;
    150 
    151         RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
    152 
    153                 RenderingHints.VALUE_ANTIALIAS_ON);
    154 
    155         g2.addRenderingHints(rh);
    156 
    157         // 半透明
    158 
    159         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
    160 
    161                 0.5f));
    162 
    163         // 设置填充颜色,这里设置了渐变,由下往上
    164 
    165         // g2.setPaint(new GradientPaint(c.getWidth() / 2, 1, Color.GRAY,
    166 
    167         // c.getWidth() / 2, c.getHeight(), Color.GRAY));
    168 
    169         // 填充圆角矩形
    170 
    171         g2.fillRoundRect(0, 0, 40, thumbBounds.height - 1, 5, 5);
    172 
    173     }
    174 
    175 
    176     /**
    177 
    178      * 创建滚动条上方的按钮
    179 
    180      */
    181 
    182     @Override
    183 
    184     protected JButton createIncreaseButton(int orientation) {
    185 
    186         JButton button = new JButton();
    187 
    188         button.setBorderPainted(false);
    189 
    190         button.setContentAreaFilled(false);
    191 
    192         button.setBorder(null);
    193 
    194         return button;
    195 
    196     }
    197 
    198     /**
    199 
    200      * 创建滚动条下方的按钮
    201 
    202      */
    203 
    204     @Override
    205 
    206     protected JButton createDecreaseButton(int orientation) {
    207 
    208         JButton button = new JButton();
    209 
    210         button.setBorderPainted(false);
    211 
    212         button.setContentAreaFilled(false);
    213 
    214         button.setFocusable(false);
    215 
    216         button.setBorder(null);
    217 
    218         return button;
    219 
    220     }
    221 
    222 }
    2.使用自定义类,覆盖JScrollPane滚动条样式
    1  JScrollPane scrollPane = new JScrollPane();
    2  scrollPane.getVerticalScrollBar().setUI(new DemoScrollBarUI());
      1 import java.awt.AlphaComposite;
      2 import java.awt.Color;
      3 import java.awt.Dimension;
      4 import java.awt.GradientPaint;
      5 import java.awt.Graphics;
      6 import java.awt.Graphics2D;
      7 import java.awt.GridLayout;
      8 import java.awt.Rectangle;
      9 import java.awt.RenderingHints;
     10 
     11 import javax.swing.JButton;
     12 import javax.swing.JComponent;
     13 import javax.swing.JFrame;
     14 import javax.swing.JPanel;
     15 import javax.swing.JScrollBar;
     16 import javax.swing.JScrollPane;
     17 import javax.swing.WindowConstants;
     18 import javax.swing.plaf.basic.BasicScrollBarUI;
     19 
     20 /**
     21 
     22  * 自定义滚动条UI
     23 
     24  *
     25 
     26  * @author zsg
     27 
     28  */
     29 
     30 public class DemoScrollBarUI extends BasicScrollBarUI {
     31 
     32     // 手柄宽度
     33     private static final int thumbWidth = 40;
     34 
     35     //手柄透明度
     36     private static final float opaque = 0.8f;
     37     // 手柄边框颜色
     38     private static final Color thumbColor = new Color(51, 47, 154);
     39 
     40     // 手柄颜色
     41     private static final Color thumbColorFrom = new Color(51, 47, 154);
     42     private static final Color thumbColorTo = new Color(51, 47, 154);
     43 
     44     // 滑道颜色
     45     private static final Color backColorFrom = new Color(255, 255, 255);
     46     private static final Color backColorTo = new Color(255, 255, 255);
     47 
     48     @Override
     49     protected void configureScrollBarColors() {
     50 
     51         // 把手
     52 
     53         // thumbColor = Color.GRAY;
     54 
     55         // thumbHighlightColor = Color.BLUE;
     56 
     57         // thumbDarkShadowColor = Color.BLACK;
     58 
     59         // thumbLightShadowColor = Color.YELLOW;
     60 
     61         // 滑道
     62 
     63         //        trackColor = Color.black;
     64 
     65         setThumbBounds(0, 0, 3, 10);
     66 
     67         // trackHighlightColor = Color.GREEN;
     68 
     69     }
     70 
     71     /**
     72 
     73      * 设置滚动条的宽度
     74 
     75      */
     76 
     77     @Override
     78     public Dimension getPreferredSize(JComponent c) {
     79 
     80         // TODO Auto-generated method stub
     81 
     82         //        c.setPreferredSize(new Dimension(thumbWidth, 0));
     83         c.setPreferredSize(new Dimension(thumbWidth, thumbWidth));
     84 
     85         return super.getPreferredSize(c);
     86 
     87     }
     88 
     89     // 重绘滑块的滑动区域背景
     90 
     91     public void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
     92 
     93         Graphics2D g2 = (Graphics2D) g;
     94 
     95         GradientPaint gp = null;
     96 
     97         //判断滚动条是垂直的 还是水平的
     98 
     99         if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL) {
    100             //设置画笔
    101             // 颜色渐变
    102             gp = new GradientPaint(0, 0, backColorFrom, 0, trackBounds.height, backColorTo);
    103 
    104         }
    105 
    106         if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL) {
    107             gp = new GradientPaint(0, 0, backColorFrom, trackBounds.width, 0, backColorTo);
    108         }
    109 
    110         g2.setPaint(gp);
    111 
    112         //填充Track
    113 
    114         g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height);
    115 
    116         //绘制Track的边框
    117         /*       g2.setColor(new Color(175, 155, 95));
    118          g2.drawRect(trackBounds.x, trackBounds.y, trackBounds.width - 1,
    119                 trackBounds.height - 1);
    120                 */
    121 
    122         if (trackHighlight == BasicScrollBarUI.DECREASE_HIGHLIGHT)
    123             this.paintDecreaseHighlight(g);
    124 
    125         if (trackHighlight == BasicScrollBarUI.INCREASE_HIGHLIGHT)
    126             this.paintIncreaseHighlight(g);
    127 
    128     }
    129 
    130     @Override
    131     protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
    132 
    133         // 把绘制区的x,y点坐标定义为坐标系的原点
    134 
    135         // 这句一定一定要加上啊,不然拖动就失效了
    136 
    137         g.translate(thumbBounds.x, thumbBounds.y);
    138 
    139         // 设置把手颜色
    140 
    141         //        g.setColor(new Color(230, 230, 250));
    142         g.setColor(thumbColor);
    143 
    144         // 画一个圆角矩形
    145 
    146         // 这里面前四个参数就不多讲了,坐标和宽高
    147 
    148         // 后两个参数需要注意一下,是用来控制角落的圆角弧度
    149 
    150         //         g.drawRoundRect(0, 0, 5, thumbBounds.height - 1, 5, 5);
    151         g.drawRoundRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 1, 5, 5);
    152 
    153         // 消除锯齿
    154 
    155         Graphics2D g2 = (Graphics2D) g;
    156 
    157         RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    158 
    159         g2.addRenderingHints(rh);
    160 
    161         // 半透明
    162         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opaque));
    163 
    164         // 设置填充颜色,这里设置了渐变,由下往上
    165         g2.setPaint(new GradientPaint(c.getWidth() / 2, 1, thumbColorFrom, c.getWidth() / 2, c.getHeight(),
    166                 thumbColorTo));
    167 
    168         // 填充圆角矩形
    169         //        g2.fillRoundRect(0, 0, thumbWidth, thumbBounds.height - 1, 5, 5);
    170         g2.fillRoundRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 1, 5, 5);
    171 
    172     }
    173 
    174     /**
    175 
    176      * 创建滚动条上方的按钮
    177 
    178      */
    179 
    180     @Override
    181     protected JButton createIncreaseButton(int orientation) {
    182 
    183         JButton button = new JButton();
    184 
    185         button.setBorderPainted(true);
    186 
    187         button.setContentAreaFilled(true);
    188 
    189         // 设置为null, 禁止上方按钮
    190         button.setBorder(null);
    191 
    192         return button;
    193 
    194     }
    195 
    196     /**
    197 
    198      * 创建滚动条下方的按钮
    199 
    200      */
    201 
    202     @Override
    203     protected JButton createDecreaseButton(int orientation) {
    204 
    205         JButton button = new JButton();
    206 
    207         button.setBorderPainted(true);
    208 
    209         button.setContentAreaFilled(true);
    210 
    211         button.setFocusable(false);
    212 
    213         // 设置为null, 禁止上方按钮
    214         button.setBorder(null);
    215 
    216         return button;
    217 
    218     }
    219 
    220     public static void main(String[] args) {
    221 
    222         JFrame jf = new JFrame("测试窗口");
    223         jf.setSize(1500, 800);
    224         jf.setLocationRelativeTo(null);
    225         jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    226 
    227         JPanel jp = new JPanel();
    228 
    229         GridLayout gridLayout = new GridLayout(4, 0, 0, 0);
    230         jp.setLayout(gridLayout);
    231 
    232         for (int index = 0; index < 1000; index++) {
    233             jp.add(new JButton("asssssssssssssssssssssssssssssssssssss"));
    234         }
    235 
    236         JScrollPane scrollPane = new JScrollPane();
    237         //        scrollPane.getVerticalScrollBar().setUI(new DemoScrollBarUI());
    238         scrollPane.getHorizontalScrollBar().setUI(new DemoScrollBarUI());
    239 
    240         //                scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    241         //        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    242 
    243         scrollPane.setViewportView(jp);
    244 
    245         jf.add(scrollPane);
    246 
    247         jf.setVisible(true);
    248 
    249     }
    250 }
  • 相关阅读:
    poj3669 广搜
    检索所有课程都选修的的学生的学号与姓名
    UVA10160 Servicing Stations
    uva11205 The broken pedometer 子集生成
    poj1101 the game 广搜
    poj3009 Curling 2.0 深搜
    poj 1564 Sum It Up 搜索
    HDU 2268 How To Use The Car (数学题)
    codeforces 467C George and Job(简单dp,看了题解抄一遍)
    HDU 2267 How Many People Can Survive(广搜,简单)
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/9490880.html
Copyright © 2011-2022 走看看