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方法的更多相关文章

  1. 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法

    package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 */public class TestLis ...

  2. C#中在比较自定义对象的时候要重写Equals方法

    using System;using System.Collections.Generic;using System.Text; namespace Equal{    using System; c ...

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

    我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...

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

    我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView 比如我们之前 ...

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

    项目:具有圆形效果的自定义View 一.继承View并重写onDraw方法 public class CircleView extends View{ private static final int ...

  6. css3自定义移动端滚动条

    css3自定义移动端滚动条<pre>/*定义滚动条宽 高度是根据内容设置的高度决定的*/::-webkit-scrollbar{ width: 5px;} /*定义滚动条轨道 内阴影+圆角 ...

  7. Java Swing 自定义Dialog确认对话框

    Java Swing 自定义Dialog 需求:当点击JFrame窗口的关闭按钮时,弹框询问是否确定关闭窗口,如果是则关闭程序,否就让弹框消失什么也不做(使用Dialog). 分析:虽然Java提供了 ...

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

    如果你是自定义button  那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的butt ...

  9. 手机3D游戏开发:自定义Joystick的相关设置和脚本源码

    Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...

随机推荐

  1. 【LeetCode】汇总

    此贴为汇总贴 673. Number of Longest Increasing Subsequence 075. Sort Colors 009. Palindrome Number 008. St ...

  2. 《笔者带你剖析Apache Commons DbUtils 1.6》(转)

    前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...

  3. Quartz数据库脚本

    QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括 Cron表达式和时区信息  ...

  4. linux之使用rpmbuild打rpm包

    linux之使用rpmbuild打rpm包 前言: 已从事linux运维工作数年,感觉自己还是个小菜鸟,没有大神那么的钻研的精神.只是单纯热爱,喜欢对着黑色的屏幕敲击命令,喜欢这种感觉.为什么要做RP ...

  5. HTTP API 设计指南

    本指南描述了一系列 HTTP+JSON API 的设计实践, 来自并展开于 Heroku Platform API 的工作.本指南指导着Heroku内部API的开发,我们希望也能对Heroku以外的A ...

  6. python selenium中iframe切换、window切换方法

    一.selenium中iframe切换方法: 方法一:switch_to.frame frame函数中提供了三种定位方法:by index, name, or webelement. driver.s ...

  7. windows下配置protobuf2.6.1

    步骤: 下载protobuf-2.6.1.zip和protoc-2.6.1-win32.zip,地址:https://github.com/google/protobuf/tags 到目录protob ...

  8. 用cascade删除有约束的表或记录

    删除有约束的表 Drop table TERMPRO_RULE_ROUTE_TYPE cascade constraints:

  9. 5.solr学习速成之语法

    常用查询参数 q - 查询字符串,必须的.   fl - 指定返回那些字段内容,用逗号或空格分隔多个.  start - 返回第一条记录在完整找到结果中的偏移位置,0开始.   rows - 指定返回 ...

  10. Postgresql VACUUM COPY等

    1.VACUUM VACUUM回收dead tuples占用的存储空间. 在一般的PostgreSQL操作中,被update操作删除或废弃的元组不会从物理表中删除; 它们一直存在,直到执行VACUUM ...