1. 程式人生 > >Swing自定義JScrollPane的滾動條設置,重寫BasicScrollBarUI方法

Swing自定義JScrollPane的滾動條設置,重寫BasicScrollBarUI方法

rec rto 滑動 jpa ans icon lac log 測試

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方法