Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法
Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法
摘自:https://blog.csdn.net/qq_31635851/article/details/80986870
1.自定义BasicScrollBarUI类
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints; import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.plaf.basic.BasicScrollBarUI; /** * 自定义滚动条UI * * @author zsg */ public class DemoScrollBarUI extends BasicScrollBarUI { @Override
protected void configureScrollBarColors() { // 把手 // thumbColor = Color.GRAY; // thumbHighlightColor = Color.BLUE; // thumbDarkShadowColor = Color.BLACK; // thumbLightShadowColor = Color.YELLOW; // 滑道 trackColor = Color.black; setThumbBounds(0, 0, 3, 10); // trackHighlightColor = Color.GREEN; } /** * 设置滚动条的宽度 */ @Override
public Dimension getPreferredSize(JComponent c) { // TODO Auto-generated method stub c.setPreferredSize(new Dimension(40, 0)); return super.getPreferredSize(c); } // 重绘滑块的滑动区域背景 public void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) { Graphics2D g2 = (Graphics2D) g; GradientPaint gp = null; //判断滚动条是垂直的 还是水平的 if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL) { //设置画笔 gp = new GradientPaint(0, 0, new Color(80, 80, 80), trackBounds.width, 0, new Color(80, 80, 80)); } if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL) { gp = new GradientPaint(0, 0, new Color(80, 80, 80), trackBounds.height, 0, new Color(80, 80, 80)); } g2.setPaint(gp); //填充Track g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height); //绘制Track的边框
/* g2.setColor(new Color(175, 155, 95));
g2.drawRect(trackBounds.x, trackBounds.y, trackBounds.width - 1,
trackBounds.height - 1);
*/ if (trackHighlight == BasicScrollBarUI.DECREASE_HIGHLIGHT) this.paintDecreaseHighlight(g); if (trackHighlight == BasicScrollBarUI.INCREASE_HIGHLIGHT) this.paintIncreaseHighlight(g); } @Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { // 把绘制区的x,y点坐标定义为坐标系的原点 // 这句一定一定要加上啊,不然拖动就失效了 g.translate(thumbBounds.x, thumbBounds.y); // 设置把手颜色 g.setColor(new Color( 230,230,250)); // 画一个圆角矩形 // 这里面前四个参数就不多讲了,坐标和宽高 // 后两个参数需要注意一下,是用来控制角落的圆角弧度 // g.drawRoundRect(0, 0, 5, thumbBounds.height - 1, 5, 5); // 消除锯齿 Graphics2D g2 = (Graphics2D) g; RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.addRenderingHints(rh); // 半透明 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); // 设置填充颜色,这里设置了渐变,由下往上 // g2.setPaint(new GradientPaint(c.getWidth() / 2, 1, Color.GRAY, // c.getWidth() / 2, c.getHeight(), Color.GRAY)); // 填充圆角矩形 g2.fillRoundRect(0, 0, 40, thumbBounds.height - 1, 5, 5); } /** * 创建滚动条上方的按钮 */ @Override protected JButton createIncreaseButton(int orientation) { JButton button = new JButton(); button.setBorderPainted(false); button.setContentAreaFilled(false); button.setBorder(null); return button; } /** * 创建滚动条下方的按钮 */ @Override protected JButton createDecreaseButton(int orientation) { JButton button = new JButton(); button.setBorderPainted(false); button.setContentAreaFilled(false); button.setFocusable(false); button.setBorder(null); return button; } }
2.使用自定义类,覆盖JScrollPane滚动条样式
JScrollPane scrollPane = new JScrollPane();
scrollPane.getVerticalScrollBar().setUI(new DemoScrollBarUI());
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.awt.RenderingHints; import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.WindowConstants;
import javax.swing.plaf.basic.BasicScrollBarUI; /** * 自定义滚动条UI * * @author zsg */ public class DemoScrollBarUI extends BasicScrollBarUI { // 手柄宽度
private static final int thumbWidth = 40; //手柄透明度
private static final float opaque = 0.8f;
// 手柄边框颜色
private static final Color thumbColor = new Color(51, 47, 154); // 手柄颜色
private static final Color thumbColorFrom = new Color(51, 47, 154);
private static final Color thumbColorTo = new Color(51, 47, 154); // 滑道颜色
private static final Color backColorFrom = new Color(255, 255, 255);
private static final Color backColorTo = new Color(255, 255, 255); @Override
protected void configureScrollBarColors() { // 把手 // thumbColor = Color.GRAY; // thumbHighlightColor = Color.BLUE; // thumbDarkShadowColor = Color.BLACK; // thumbLightShadowColor = Color.YELLOW; // 滑道 // trackColor = Color.black; setThumbBounds(0, 0, 3, 10); // trackHighlightColor = Color.GREEN; } /** * 设置滚动条的宽度 */ @Override
public Dimension getPreferredSize(JComponent c) { // TODO Auto-generated method stub // c.setPreferredSize(new Dimension(thumbWidth, 0));
c.setPreferredSize(new Dimension(thumbWidth, thumbWidth)); return super.getPreferredSize(c); } // 重绘滑块的滑动区域背景 public void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) { Graphics2D g2 = (Graphics2D) g; GradientPaint gp = null; //判断滚动条是垂直的 还是水平的 if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL) {
//设置画笔
// 颜色渐变
gp = new GradientPaint(0, 0, backColorFrom, 0, trackBounds.height, backColorTo); } if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL) {
gp = new GradientPaint(0, 0, backColorFrom, trackBounds.width, 0, backColorTo);
} g2.setPaint(gp); //填充Track g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height); //绘制Track的边框
/* g2.setColor(new Color(175, 155, 95));
g2.drawRect(trackBounds.x, trackBounds.y, trackBounds.width - 1,
trackBounds.height - 1);
*/ if (trackHighlight == BasicScrollBarUI.DECREASE_HIGHLIGHT)
this.paintDecreaseHighlight(g); if (trackHighlight == BasicScrollBarUI.INCREASE_HIGHLIGHT)
this.paintIncreaseHighlight(g); } @Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { // 把绘制区的x,y点坐标定义为坐标系的原点 // 这句一定一定要加上啊,不然拖动就失效了 g.translate(thumbBounds.x, thumbBounds.y); // 设置把手颜色 // g.setColor(new Color(230, 230, 250));
g.setColor(thumbColor); // 画一个圆角矩形 // 这里面前四个参数就不多讲了,坐标和宽高 // 后两个参数需要注意一下,是用来控制角落的圆角弧度 // g.drawRoundRect(0, 0, 5, thumbBounds.height - 1, 5, 5);
g.drawRoundRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 1, 5, 5); // 消除锯齿 Graphics2D g2 = (Graphics2D) g; RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.addRenderingHints(rh); // 半透明
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opaque)); // 设置填充颜色,这里设置了渐变,由下往上
g2.setPaint(new GradientPaint(c.getWidth() / 2, 1, thumbColorFrom, c.getWidth() / 2, c.getHeight(),
thumbColorTo)); // 填充圆角矩形
// g2.fillRoundRect(0, 0, thumbWidth, thumbBounds.height - 1, 5, 5);
g2.fillRoundRect(0, 0, thumbBounds.width - 1, thumbBounds.height - 1, 5, 5); } /** * 创建滚动条上方的按钮 */ @Override
protected JButton createIncreaseButton(int orientation) { JButton button = new JButton(); button.setBorderPainted(true); button.setContentAreaFilled(true); // 设置为null, 禁止上方按钮
button.setBorder(null); return button; } /** * 创建滚动条下方的按钮 */ @Override
protected JButton createDecreaseButton(int orientation) { JButton button = new JButton(); button.setBorderPainted(true); button.setContentAreaFilled(true); button.setFocusable(false); // 设置为null, 禁止上方按钮
button.setBorder(null); return button; } public static void main(String[] args) { JFrame jf = new JFrame("测试窗口");
jf.setSize(1500, 800);
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); JPanel jp = new JPanel(); GridLayout gridLayout = new GridLayout(4, 0, 0, 0);
jp.setLayout(gridLayout); for (int index = 0; index < 1000; index++) {
jp.add(new JButton("asssssssssssssssssssssssssssssssssssss"));
} JScrollPane scrollPane = new JScrollPane();
// scrollPane.getVerticalScrollBar().setUI(new DemoScrollBarUI());
scrollPane.getHorizontalScrollBar().setUI(new DemoScrollBarUI()); // scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
// scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); scrollPane.setViewportView(jp); jf.add(scrollPane); jf.setVisible(true); }
}
Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法的更多相关文章
- 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法
package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 */public class TestLis ...
- C#中在比较自定义对象的时候要重写Equals方法
using System;using System.Collections.Generic;using System.Text; namespace Equal{ using System; c ...
- 自定义UICollectionViewController之后 如何设置UICollectionView的布局方式
我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView 通过初始化的时候 传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...
- 自定义UICollectionViewController之后 如何设置UICollectionView的布局方式--备用
我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView 通过初始化的时候 传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...
- 自定义View 一 (继承VIew重写onDraw方法)
项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int ...
- css3自定义移动端滚动条
css3自定义移动端滚动条<pre>/*定义滚动条宽 高度是根据内容设置的高度决定的*/::-webkit-scrollbar{ width: 5px;} /*定义滚动条轨道 内阴影+圆角 ...
- Java Swing 自定义Dialog确认对话框
Java Swing 自定义Dialog 需求:当点击JFrame窗口的关闭按钮时,弹框询问是否确定关闭窗口,如果是则关闭程序,否就让弹框消失什么也不做(使用Dialog). 分析:虽然Java提供了 ...
- 自定义Button 的图片设置不显示问题。
如果你是自定义button 那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的butt ...
- 手机3D游戏开发:自定义Joystick的相关设置和脚本源码
Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...
随机推荐
- ul li 水平居中
li的float:left方法显然有一个问题,就是无法居中(水平),只能使用padding-left或margin-right的方法方法来固定其居中.但这样可能在宽屏与窄屏的显示不一致.使用这种方法主 ...
- 有返回值的多线程demo
package com.jimmy.demo.util; import java.util.HashMap;import java.util.concurrent.*;import java.util ...
- SQL TINYINT 1 讨论记录
SQL TINYINT 1 讨论记录 群里有一位小伙伴又和他上司怒上了,关于 TINYINT 1 的问题. 这里记录一下,TINYINT 无符号可以是 0~255,而这里的 长度 1只是长度,并不是存 ...
- vue的双向绑定原理解析(vue项目重构二)
现在的前端框架 如果没有个数据的双向/单向绑定,都不好意思说是一个新的框架,至于为什么需要这个功能,从jq或者原生js开始做项目的前端工作者,应该是深有体会. 以下也是个人对vue的双向绑定原理的一些 ...
- C 游戏所要看的书
C 游戏所要看的书 1.C++primer中文版第4版 经典啊2.C++标准程序库自修教程与参考手册 3.Windows程序设计第5版 4.MFC windows程序设计第2版中文版 5.VC ...
- FPGA层次结构和复位策略
FPGA设计中,层次结构设计和复位策略影响着FPGA的时序.在高速设计时,合理的层次结构设计与正确的复位策略可以优化时序,提高运行频率. 设计中,合理的层次结构是我们所追求的. 划分时,按照逻辑分区将 ...
- mysql权限验证流程
mysql用户管理,逐级下查 mysql库的user表连接信息,全局权限db表记录用户对库的权限,对某个数据库的所有表的权限tables_priv 设置用户对表的权限columns_priv设置用户对 ...
- Jmeter录制HTTPS 补充
Jmeter有录制功能,录制HTTPs需要增加一个证书配置,录制步骤如下: 1.打开jmeter,添加线程组.线程组右键,逻辑控制器>录制控制器 工作台 右键 非测试元件 >HTTP代理服 ...
- java实例三维空间求点之间的距离。。。。
package com.b; public class Ponit { private double x; private double y; private double z; public Pon ...
- ajax-简介和实现注册登录
ajax知识点介绍: 异步Javascript和XML,用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML),也有可能是json 优点: 1. AJAX使 ...