swing

JSCrollbar重绘
实现起来还是非常简单的,首先是从BasicScrollBarUI类派生出一个子类,然后重写其中的相关方法就行了。接着在需要使用滚动条的地方用setUI方法直接载入就行了。例如

view plaincopy to clipboardprint?
JScrollPane spa = new JScrollPane(list);   
spa.getVerticalScrollBar().setUI(new CBScrollBarUI());  
JScrollPane spa = new JScrollPane(list);
spa.getVerticalScrollBar().setUI(new CBScrollBarUI()); 

好了,不多说了,还是看代码吧,相关的内容我有做注释

view plaincopy to clipboardprint?
package ui.control;   
  
import images.ImageLoader;   
  
import java.awt.Color;   
import java.awt.Dimension;   
import java.awt.GradientPaint;   
import java.awt.Graphics;   
import java.awt.Graphics2D;   
import java.awt.Image;   
import java.awt.Insets;   
import java.awt.Rectangle;   
import java.awt.geom.Point2D;   
  
import javax.swing.ImageIcon;   
import javax.swing.JButton;   
import javax.swing.JComponent;   
import javax.swing.JScrollBar;   
import javax.swing.plaf.basic.BasicArrowButton;   
import javax.swing.plaf.basic.BasicScrollBarUI;   
  
public class CBScrollBarUI extends BasicScrollBarUI   
{   
    private Color frameColor = new Color(145, 105, 55);   
  
    public Dimension getPreferredSize(JComponent c)   
    {   
        return new Dimension(16, 16);   
    }   
  
    // 重绘滚动条的滑块   
    public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds)   
    {   
        super.paintThumb(g, c, thumbBounds);   
        int tw = thumbBounds.width;   
        int th = thumbBounds.height;   
        // 重定图形上下文的原点,这句一定要写,不然会出现拖动滑块时滑块不动的现象   
        g.translate(thumbBounds.x, thumbBounds.y);   
  
        Graphics2D g2 = (Graphics2D) g;   
        GradientPaint gp = null;   
        if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL)   
        {   
            gp = new GradientPaint(0, 0, new Color(242, 222, 198), tw, 0, new Color(207, 190, 164));   
        }   
        if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)   
        {   
            gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, th, new Color(207, 190, 164));   
        }   
        g2.setPaint(gp);   
        g2.fillRoundRect(0, 0, tw - 1, th - 1, 5, 5);   
        g2.setColor(frameColor);   
        g2.drawRoundRect(0, 0, tw - 1, th - 1, 5, 5);   
    }   
  
    // 重绘滑块的滑动区域背景   
    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(198, 178, 151), trackBounds.width, 0, new Color(234, 214, 190));   
        }   
        if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)   
        {   
            gp = new GradientPaint(0, 0, new Color(198, 178, 151), 0, trackBounds.height, new Color(234, 214, 190));   
        }   
        g2.setPaint(gp);   
        g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height);   
        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);   
    }   
  
    // 重绘当鼠标点击滑动到向上或向左按钮之间的区域   
    protected void paintDecreaseHighlight(Graphics g)   
    {   
        g.setColor(Color.green);   
        int x = this.getTrackBounds().x;   
        int y = this.getTrackBounds().y;   
        int w = 0, h = 0;   
        if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL)   
        {   
            w = this.getThumbBounds().width;   
            h = this.getThumbBounds().y - y;   
  
        }   
        if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)   
        {   
            w = this.getThumbBounds().x - x;   
            h = this.getThumbBounds().height;   
        }   
        g.fillRect(x, y, w, h);   
    }   
  
    // 重绘当鼠标点击滑块至向下或向右按钮之间的区域   
    protected void paintIncreaseHighlight(Graphics g)   
    {   
        Insets insets = scrollbar.getInsets();   
        g.setColor(Color.blue);   
        int x = this.getThumbBounds().x;   
        int y = this.getThumbBounds().y;   
        int w = this.getTrackBounds().width;   
        int h = this.getTrackBounds().height;   
        g.fillRect(x, y, w, h);   
    }   
  
    protected JButton createIncreaseButton(int orientation)   
    {   
        return new BasicArrowButton(orientation)   
        {   
            // 重绘按钮的三角标记   
            public void paintTriangle(Graphics g, int x, int y, int size, int direction, boolean isEnabled)   
            {   
                Graphics2D g2 = (Graphics2D) g;   
                GradientPaint gp = null;   
                Image arrowImg = null;   
                switch (this.getDirection())   
                {   
                case BasicArrowButton.SOUTH:   
                    gp = new GradientPaint(0, 0, new Color(242, 222, 198), getWidth(), 0, new Color(207, 190, 164));   
                    arrowImg = ImageLoader.get("south.gif");   
                    break;   
                case BasicArrowButton.EAST:   
                    gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, getHeight(), new Color(207, 190, 164));   
                    arrowImg = ImageLoader.get("east.gif");   
                    break;   
                }   
                g2.setPaint(gp);   
                g2.fillRect(0, 0, getWidth(), getHeight());   
                g2.setColor(frameColor);   
                g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);   
                g2.drawImage(arrowImg, (getWidth() - 2) / 2 - 5, (getHeight() - 2) / 2 - 5, 13, 13, null);   
            }   
        };   
    }   
  
    protected JButton createDecreaseButton(int orientation)   
    {   
        return new BasicArrowButton(orientation)   
        {   
            public void paintTriangle(Graphics g, int x, int y, int size, int direction, boolean isEnabled)   
            {   
                Graphics2D g2 = (Graphics2D) g;   
                GradientPaint gp = null;   
                Image arrowImg = null;   
                switch (this.getDirection())   
                {   
                case BasicArrowButton.NORTH:   
                    gp = new GradientPaint(0, 0, new Color(242, 222, 198), getWidth(), 0, new Color(207, 190, 164));   
                    arrowImg = ImageLoader.get("north.gif");   
                    break;   
                case BasicArrowButton.WEST:   
                    gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, getHeight(), new Color(207, 190, 164));   
                    arrowImg = ImageLoader.get("west.gif");   
                    break;   
                }   
                g2.setPaint(gp);   
                g2.fillRect(0, 0, getWidth(), getHeight());   
                g2.setColor(frameColor);   
                g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);   
                g2.drawImage(arrowImg, (getWidth() - 2) / 2 - 5, (getHeight() - 2) / 2 - 5, 13, 13, null);   
            }   
        };   
    }   
}  
package ui.control;

import images.ImageLoader;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.geom.Point2D;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JScrollBar;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.plaf.basic.BasicScrollBarUI;

public class CBScrollBarUI extends BasicScrollBarUI
{
	private Color frameColor = new Color(145, 105, 55);

	public Dimension getPreferredSize(JComponent c)
	{
		return new Dimension(16, 16);
	}

	// 重绘滚动条的滑块
	public void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds)
	{
		super.paintThumb(g, c, thumbBounds);
		int tw = thumbBounds.width;
		int th = thumbBounds.height;
		// 重定图形上下文的原点,这句一定要写,不然会出现拖动滑块时滑块不动的现象
		g.translate(thumbBounds.x, thumbBounds.y);

		Graphics2D g2 = (Graphics2D) g;
		GradientPaint gp = null;
		if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL)
		{
			gp = new GradientPaint(0, 0, new Color(242, 222, 198), tw, 0, new Color(207, 190, 164));
		}
		if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)
		{
			gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, th, new Color(207, 190, 164));
		}
		g2.setPaint(gp);
		g2.fillRoundRect(0, 0, tw - 1, th - 1, 5, 5);
		g2.setColor(frameColor);
		g2.drawRoundRect(0, 0, tw - 1, th - 1, 5, 5);
	}

	// 重绘滑块的滑动区域背景
	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(198, 178, 151), trackBounds.width, 0, new Color(234, 214, 190));
		}
		if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)
		{
			gp = new GradientPaint(0, 0, new Color(198, 178, 151), 0, trackBounds.height, new Color(234, 214, 190));
		}
		g2.setPaint(gp);
		g2.fillRect(trackBounds.x, trackBounds.y, trackBounds.width, trackBounds.height);
		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);
	}

	// 重绘当鼠标点击滑动到向上或向左按钮之间的区域
	protected void paintDecreaseHighlight(Graphics g)
	{
		g.setColor(Color.green);
		int x = this.getTrackBounds().x;
		int y = this.getTrackBounds().y;
		int w = 0, h = 0;
		if (this.scrollbar.getOrientation() == JScrollBar.VERTICAL)
		{
			w = this.getThumbBounds().width;
			h = this.getThumbBounds().y - y;

		}
		if (this.scrollbar.getOrientation() == JScrollBar.HORIZONTAL)
		{
			w = this.getThumbBounds().x - x;
			h = this.getThumbBounds().height;
		}
		g.fillRect(x, y, w, h);
	}

	// 重绘当鼠标点击滑块至向下或向右按钮之间的区域
	protected void paintIncreaseHighlight(Graphics g)
	{
		Insets insets = scrollbar.getInsets();
		g.setColor(Color.blue);
		int x = this.getThumbBounds().x;
		int y = this.getThumbBounds().y;
		int w = this.getTrackBounds().width;
		int h = this.getTrackBounds().height;
		g.fillRect(x, y, w, h);
	}

	protected JButton createIncreaseButton(int orientation)
	{
		return new BasicArrowButton(orientation)
		{
			// 重绘按钮的三角标记
			public void paintTriangle(Graphics g, int x, int y, int size, int direction, boolean isEnabled)
			{
				Graphics2D g2 = (Graphics2D) g;
				GradientPaint gp = null;
				Image arrowImg = null;
				switch (this.getDirection())
				{
				case BasicArrowButton.SOUTH:
					gp = new GradientPaint(0, 0, new Color(242, 222, 198), getWidth(), 0, new Color(207, 190, 164));
					arrowImg = ImageLoader.get("south.gif");
					break;
				case BasicArrowButton.EAST:
					gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, getHeight(), new Color(207, 190, 164));
					arrowImg = ImageLoader.get("east.gif");
					break;
				}
				g2.setPaint(gp);
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.setColor(frameColor);
				g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
				g2.drawImage(arrowImg, (getWidth() - 2) / 2 - 5, (getHeight() - 2) / 2 - 5, 13, 13, null);
			}
		};
	}

	protected JButton createDecreaseButton(int orientation)
	{
		return new BasicArrowButton(orientation)
		{
			public void paintTriangle(Graphics g, int x, int y, int size, int direction, boolean isEnabled)
			{
				Graphics2D g2 = (Graphics2D) g;
				GradientPaint gp = null;
				Image arrowImg = null;
				switch (this.getDirection())
				{
				case BasicArrowButton.NORTH:
					gp = new GradientPaint(0, 0, new Color(242, 222, 198), getWidth(), 0, new Color(207, 190, 164));
					arrowImg = ImageLoader.get("north.gif");
					break;
				case BasicArrowButton.WEST:
					gp = new GradientPaint(0, 0, new Color(242, 222, 198), 0, getHeight(), new Color(207, 190, 164));
					arrowImg = ImageLoader.get("west.gif");
					break;
				}
				g2.setPaint(gp);
				g2.fillRect(0, 0, getWidth(), getHeight());
				g2.setColor(frameColor);
				g2.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
				g2.drawImage(arrowImg, (getWidth() - 2) / 2 - 5, (getHeight() - 2) / 2 - 5, 13, 13, null);
			}
		};
	}
}
 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Greentea107/archive/2011/02/24/6206086.aspx

 

你可能感兴趣的:(swing)