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

Posted LiuYanYGZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法的主要内容,如果未能解决你的问题,请参考以下文章

Java swing怎么搞出滚动条

javaswing 带滚动条文本域边框问题

(转载) Java Swing 之 JScrollPane (滚动面板) 使用方法

java swing JPanel添加在JScrollPane上,有垂直的滚动条,可是滚动条拉到底,只显示了JPanel的一部分。

给jpanel 添加上下滚动条

SWING禁用或隐藏滚动条,但启用滚轮?