Swing JSlider 美化

package com.bing.voice.ui;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class SoundAdapter extends JSlider {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SoundAdapter() {
        // 设定布局器
        // 设定监听器
        ChangeListener listener = new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                if (e.getSource() instanceof JSlider) {
                    System.out.println("刻度: "
                            + ((JSlider) e.getSource()).getValue());
                }
            }
        };
        addChangeListener(listener);
        // 设定JSlider1
        // 注入自定义ui
        setUI(new MySliderUI(this));
        // 主刻度
        setMajorTickSpacing(10);
        // 次刻度
         setMinorTickSpacing(5);
        // 设定为显示
         setPaintTicks(true);
        setPaintLabels(true);
        // 监听slider1
         addChangeListener(listener);
        // 设定JSlider2
        //使用盒式容器
        //设定窗体大小
        //setPreferredSize(new Dimension(240, 100));
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                createUI();
            }
        });
    }

    public static void createUI() {
        JFrame frame = new JFrame("音量刻度设置");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().add(new SoundAdapter());
        frame.setResizable(false);
        frame.pack();
        //居中
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
package com.bing.voice.ui;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.RenderingHints;

import javax.swing.JSlider;
import javax.swing.plaf.basic.BasicSliderUI;
import javax.swing.plaf.metal.MetalSliderUI;
//MetalSliderUI
public class MySliderUI extends BasicSliderUI{
	public MySliderUI(JSlider b) {
		super(b);
	}
	/**
	 * 绘制指示物
	 */
	public void paintThumb(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		// 填充椭圆框为当前thumb位置
		g2d.fillOval(thumbRect.x, thumbRect.y, thumbRect.width,
				thumbRect.height);
		// 也可以帖图(利用鼠标事件转换image即可体现不同状态)
		// g2d.drawImage(image, thumbRect.x, thumbRect.y,
		// thumbRect.width,thumbRect.height,null);
	}

	/**
	 * 绘制刻度轨迹
	 */
	public void paintTrack(Graphics g) {
		int cy, cw;
		Rectangle trackBounds = trackRect;
		if (slider.getOrientation() == JSlider.HORIZONTAL) {
			Graphics2D g2 = (Graphics2D) g;
			cy = (trackBounds.height / 2) - 2;
			cw = trackBounds.width;

			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
			g2.translate(trackBounds.x, trackBounds.y + cy);

			// 背景设为灰色
			g2.setPaint(Color.GRAY);
			g2.fillRect(0, -cy, cw, cy * 2);

			int trackLeft = 0;

			int trackRight = 0;

			trackRight = trackRect.width - 1;

			int middleOfThumb = 0;

			int fillLeft = 0;

			int fillRight = 0;

			// 坐标换算
			middleOfThumb = thumbRect.x + (thumbRect.width / 2);
			middleOfThumb -= trackRect.x;

			if (!drawInverted()) {
				fillLeft = !slider.isEnabled() ? trackLeft : trackLeft + 1;
				fillRight = middleOfThumb;
			} else {
				fillLeft = middleOfThumb;
				fillRight = !slider.isEnabled() ? trackRight - 1
						: trackRight - 2;
			}
			// 设定渐变
			g2.setPaint(new GradientPaint(0, 0, new Color(0, 100, 100), cw, 0,
					new Color(0, 255, 100), true));
			g2.fillRect(0, -cy, fillRight - fillLeft, cy * 2);

			g2.setPaint(slider.getBackground());
			Polygon polygon = new Polygon();
			polygon.addPoint(0, cy);
			polygon.addPoint(0, -cy);
			polygon.addPoint(cw, -cy);
			g2.fillPolygon(polygon);
			polygon.reset();

			g2.setPaint(Color.WHITE);
			g2.drawLine(0, cy, cw - 1, cy);

			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_OFF);
			g2.translate(-trackBounds.x, -(trackBounds.y + cy));
		} else {
			super.paintTrack(g);
		}
	}
}

这个slider是根据网上一个例子做的,但是网上的例子运行的时候,总是出现空指针异常,所以将网上的例子MySliderUi的父类从MetalSliderUI从MetalSliderUI换成了BasicSliderUi,就没有这个问题了。
public class MySliderUI extends BasicSliderUI{
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值