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 }

原文地址:https://www.cnblogs.com/LiuYanYGZ/p/9490880.html

时间: 2024-10-29 19:07:15

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

自定义View中为什么需要重写onMeasure()方法?

不实现OnMeasure()方法的时候 首先自定义一个简单的view: public class myView extends View { public myView(Context context) { super(context); } public myView(Context context, AttributeSet attrs) { super(context, attrs); } } 在布局中使用: <RelativeLayout xmlns:android="http:/

java swing 之 JScrollPane(滚动面板)的使用

/** * java swing 之JScrollPane面板 * 在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容,这时可以使用 * JScrollPane面板,JscrollPane面板是带滚动条的面板,也是一种容器,但是常用于布置单个 * 控件,并且不可以使用布局管理器.如果需要在JScrollPane面板中放置多个控件,需要将多个 * 控件放置到JPanel 面板上,然后将JPanel面板作为一个整体控件添加到JScrollPane控件上. * * @author g

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

1 /** 2 * java swing 之JScrollPane面板 3 * 在设置界面时,可能会遇到在一个较小的容器窗体中显示一个较大部分的内容,这时可以使用 4 * JScrollPane面板,JscrollPane面板是带滚动条的面板,也是一种容器,但是常用于布置单个 5 * 控件,并且不可以使用布局管理器.如果需要在JScrollPane面板中放置多个控件,需要将多个 6 * 控件放置到JPanel 面板上,然后将JPanel面板作为一个整体控件添加到JScrollPane控件上. 7

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式

我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView 比如我们之前是这样写得: 1 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 2 3 UICollectionView *collection = [[UICollectionView alloc]

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式--备用

我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView 比如我们之前是这样写得: 1 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 2 3 UICollectionView *collection = [[UICollectionView alloc]

Java Swing组件JScrollPane

当一个容器内放置了许多组件,而容器的显示区域不足以同时显示所有组件时,如果让容器带滚动条,通过移动滚动条的滑块,容器中位置上的组件就能看到.滚动面板JScrollPane能实现这样的要求,JScrollPane是带有滚动条的面板.JScrollPane是Container类的子类,也是一种容器,但是只能添加一个组件.JScrollPane的一般用法是先将一些组件添加到一个JPanel中,然后再把这个JPanel添加到JScrollPane中.这样,从界面上看,在滚动面板上,好像也有多个组件.在S

自定义View 一 (继承VIew重写onDraw方法)

项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int COLOR = Color.RED; private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private int mWidth = 0; private int mHeight = 0; public CircleView(Contex

easyui 自定义验证,动态设置提示信息

//自定义验证规则 名称为name //$.fn.validatebox.defaults.rules.name.message 动态自定义提示内容 $.extend($.fn.validatebox.defaults.rules, { name: { validator: function (value, param) { var error=false;; if(!/^\S{4,25}$/.test(value)){ //4-25验证 $.fn.validatebox.defaults.ru

自定义Button 的图片设置不显示问题。

如果你是自定义button  那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的button设置图片就要用 [button setImage:[UIImage imageName:@""] forstate:]; 因为自定义button 设置图片的话,就相当于给一个普通的imageView设置图片..原生button  就要用系统原生的方法来设置button.