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. EMMC架构

    现在EMMC盛行,分析总结还是很有必要的.以下以全志a64为实例切入主题. 这里a64有三个sdc0~2,硬件上sdc2是连接EMMC,这里只分析sdc2的代码. 初始化的代码在linux-3.10/ ...

  2. Google全球服务器根域名的IP地址

    Google全球服务器根域名的IP地址 目前GOOGLE正与ZF继续谈判,此谈判结果将直接影响该公司在中国的存在此前,由于曾出现Google服务器被墙,而致使众网友只能FQ搜索的窘境而目前尚不知道若G ...

  3. Linux环境安装git

    git配置 源码安装 检测当前git版本是否是2.7.4以上 git --version 如果没有安装git直接源码安装即可,如果安装了先删除原来的git. yum -y remove git 先安装 ...

  4. python 函数 hex()

    hex(x)作用:hex() 函数用于将10进制整数转换成16进制整数. x-10进制整数,返回16进制整数 实例: >>>hex(255) '0xff' >>> ...

  5. bzoj 3456 城市规划——分治FFT / 多项式求逆 / 多项式求ln

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3456 分治FFT: 设 dp[ i ] 表示 i 个点时连通的方案数. 考虑算补集:连通的方 ...

  6. EMI (电磁干扰)

    EMI是指电子产品工作会对周边的其他电子产品造成干扰,与此关联的还有EMC规范.是电子电器产品经常遇上的问题.干扰种类有传导干扰和辐射干扰. 电磁干扰(Electromagnetic Interfer ...

  7. Docker - 使用 swarm 部署 services

    前言 经过之前一段时间学习与思考,我们已经大概明确了一些感念: Docker image/container,  service and node 简单来说,swarm允许我们以节点(node)的方式 ...

  8. 大杀器TheFatRat

    项目地址:https://github.com/Screetsec/TheFatRat 安装TheFatRat root@sch01ar:/sch01ar# git clone https://git ...

  9. java - 判断 字符串是否为空

    java - 判断 字符串是否为空 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.1:if(s == null || s.equals(""));方法二: 比较字符 ...

  10. 查询cad库中,所有程序leg引用的点的id,需要预先处理点表和程序表

    select f1.pro_id,f1.pro_type, f1.code_fix_point, f1.code_type_fix_point, f1.code_fir,f2.code_icao,nv ...