`
flyPig
  • 浏览: 138741 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

自定义的进度条

JDK 
阅读更多
jdk自带的JProgressBar效果不太符合需求,如下是一个跑马灯式渐进效果的progressbar,效果就是一段渐进色的矩形来回滚动。
实现原理很简单,就是用一个线程循环绘制一个矩形区域,并用渐进色填充。详细代码如下。
public class ProcessBar extends JComponent implements ActionListener {

	private static final long serialVersionUID = 1L;
	
	private String showText;
	
	

	private final int TIMER_DELAY = 41;

	private final Dimension PREFERRED_SIZE = new Dimension(240, 16);

	private int tailLength;

	private int increment;

	private boolean movingRight;

	private int currentPosition;

	private Timer timer;

	private boolean constructed;

	public ProcessBar() {
		tailLength = 120;
		increment = 13;
		movingRight = true;
		currentPosition = 0;
		constructed = false;
		timer = new Timer(TIMER_DELAY, this);
		timer.setRepeats(true);
		setAttributes();
		Insets insets = getBorder().getBorderInsets(this);
		Dimension d = PREFERRED_SIZE;
		d.width += insets.left + insets.right;
		d.height += insets.top + insets.bottom;
		setPreferredSize(d);
		setMinimumSize(d);
		constructed = true;
	}
	
	public void setShowText(String text) {
		this.showText = text;		
	}
	
	public void removeNotify() {
		super.removeNotify();
		if (timer != null) {
			timer.stop();
			timer.removeActionListener(this);
			timer = null;
		}
	}

	public void addNotify() {
		super.addNotify();
		if (timer == null) {
			timer = new Timer(41, this);
			timer.setRepeats(true);
		}
	}

	public void actionPerformed(ActionEvent e) {
		repaint();
	}

	public void updateUI() {
		super.updateUI();
		if (constructed)
			setAttributes();
	}

	public void setIncrement(int increment) {
		if (increment > 0 && increment < 500)
			this.increment = increment;
	}

	public int getIncrement() {
		return increment;
	}

	public void setTailLength(int tailLength) {
		if (tailLength > 0 && tailLength < 500)
			this.tailLength = tailLength;
	}

	public int getTailLength() {
		return tailLength;
	}

	protected void setAttributes() {
		setOpaque(true);
		if (getBackground() == null
				|| (getBackground() instanceof ColorUIResource))
			setBackground(new ColorUIResource(UIManager.getColor("control")));
		if (getForeground() == null
				|| (getForeground() instanceof ColorUIResource))
			setForeground(new ColorUIResource(UIManager
					.getColor("ProgressBar.foreground")));
		if (getBorder() == null || (getBorder() instanceof BorderUIResource))
			setBorder(createDefaultBorder());
	}

	protected Border createDefaultBorder() {
		return new BorderUIResource(BorderFactory.createCompoundBorder(
				BorderFactory.createEtchedBorder(0, UIManager
						.getColor("controlLtHighlight"), UIManager
						.getColor("controlShadow")),
				BorderFactory.createCompoundBorder(new GradientBorder(),
						BorderFactory.createLineBorder(GradientBorder.getBrighterColor(
								UIManager.getColor("controlShadow"), 0.4F)))));
	}

	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		Color background = getBackground();
		Color foreground = getForeground();
		Insets insets = getInsets();
		Rectangle rect = getBounds();
		int height = rect.height - (insets.top + insets.bottom);
		int width = rect.width - (insets.left + insets.right);
		currentPosition += increment;
		if (currentPosition > (rect.width - (insets.left + insets.right))
				+ tailLength + increment * 2) {
			currentPosition = 0;
			movingRight = !movingRight;
		}
		g2.setColor(background);
		g2.fillRect(g.getClipBounds().x, g.getClipBounds().y,
				g.getClipBounds().width, g.getClipBounds().height);		
		int x = 0;
		background = new Color(foreground.getRed(), foreground.getGreen(),
				foreground.getBlue(), 0);
		if (movingRight) {
			x = (insets.left + currentPosition) - tailLength;
			Color temp = foreground;
			foreground = background;
			background = temp;
		} else {
			x = (insets.left + rect.width) - currentPosition;
		}
		GradientPaint gp = new GradientPaint(x, (float) insets.top
				+ (float) (height / 2), foreground, x + tailLength, insets.top
				+ height / 2, background, false);
		g2.setPaint(gp);
		Rectangle r = new Rectangle(x, insets.top, tailLength, height);
		r = r
				.intersection(new Rectangle(insets.left, insets.top, width,
						height));
		r = r.intersection(g.getClipBounds());
		g2.fillRect(r.x, r.y, r.width, r.height);
		
		g2.setPaint(Color.black);
		if(showText != null){
			g2.drawString(showText, 170, 16);
		}		
		if (timer != null && !timer.isRunning())
			timer.start();
	}

	
}
分享到:
评论

相关推荐

    C#自定义进度条大全

    在C#编程中,自定义进度条是一种常见且实用的需求,它可以为用户提供视觉反馈,显示应用程序执行任务的进度。本文将深入探讨如何在C#中实现各种自定义进度条,包括圆滑的、多边形的等不同设计样式,并提供相关的控件...

    QT 自定义进度条实例

    QT自定义进度条实例是一个基于QT框架的编程项目,旨在展示如何通过自定义样式和功能来创建美观且实用的进度条组件。QT是一个跨平台的C++图形用户界面应用程序开发框架,广泛应用于桌面、移动以及嵌入式系统。在本...

    C# Winform 自定义进度条ProgressBar

    "C# Winform 自定义进度条ProgressBar"的主题正聚焦于这一需求,允许开发者根据自己的喜好或者项目需求改变默认进度条的外观,特别是其背景颜色。 进度条(ProgressBar)是Windows应用程序中常见的一种组件,用于...

    iPhone之实现自定义进度条Progress

    在iOS开发中,创建自定义进度条是提升用户体验和界面美观度的重要手段。"iPhone之实现自定义进度条Progress"这个主题将引导我们探讨如何在iPhone应用中利用Swift编程语言来设计并实现一个个性化的进度条组件。我们将...

    Android自定义进度条样式一

    本主题将深入探讨如何创建一个自定义的进度条样式,即“Android自定义进度条样式一”。我们将讨论以下几个关键知识点: 1. **自定义View的原理** 自定义进度条本质上是自定义一个Android的View类。在Android中,你...

    android 竖直自定义进度条 带文字竖直进度条 类似电量显示

    本示例主要讲解如何创建一个竖直方向的自定义进度条,并且带有文字显示,类似手机电量的展示效果。这一功能对于某些需要实时反馈进度的应用场景,如加载、下载等,尤其有用。 首先,我们从`progressbar`这个标签...

    WPF自定义进度条控件,横竖都有

    在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF) 中自定义进度条控件,以实现横置和竖置两种显示方式。WPF 是.NET Framework 的一部分,它为开发人员提供了丰富的用户界面(UI)框架,支持2D...

    iOS开发,自定义进度条

    在iOS开发中,自定义进度条是常见的需求,它允许开发者根据应用的视觉风格和功能需求来定制UI组件。本文将深入探讨如何在iOS中创建一个自定义的进度条,并提供一些关键知识点。 首先,我们需要了解iOS中的进度条...

    自定义进度条

    在IT行业中,自定义进度条是一种常见的用户界面(UI)元素,它允许用户直观地了解应用程序执行任务的进度。在Android、iOS、Web应用以及桌面软件等多平台开发中,自定义进度条的设计和实现都是必不可少的技术环节。...

    html5 javascript实现的视频自定义进度条

    在这个场景中,我们关注的是使用这两种技术实现的视频自定义进度条,这是一个非常实用的功能,尤其对于视频监控回放这样的应用。下面将详细探讨如何使用HTML5和JavaScript来实现这一功能。 首先,HTML5的`&lt;video&gt;`...

    ios-自定义进度条Swift实现.zip

    "ios-自定义进度条Swift实现.zip"这个压缩包提供了一个使用Swift编程语言实现自定义进度条的示例。在这个项目中,开发者创建了一个不同于系统默认UIProgressView的自定义组件,以满足更个性化的界面需求。 首先,...

    QML自定义进度条

    在QML(Qt Quick)中,开发者可以利用其强大的图形化和声明式编程特性来创建自定义组件,比如自定义进度条。QML是Qt框架的一部分,主要用于构建用户界面,它允许通过直观的代码来描述UI元素的外观和行为。在本教程中...

    Android自定义进度条

    今天我们将深入探讨如何自定义一个进度条,这个话题源于一个博客文章——"Android自定义进度条",作者分享了他在实现这一功能时的经验和代码分析。在本文中,我们将详细解析自定义进度条的关键步骤和涉及的技术点。 ...

    Android自定义进度条集合(源码)

    Android自定义进度条集合(源码):固定进度条,可拖动进度条、Seekbar进度条、装逼炫酷进度条、气泡进度条、梅花进度条、IOS进度条、圆形进度条,吃豆豆进度条....,等等27个自定义进度条。源码直接解压可用。也可...

    自定义进度条对话框

    在IT开发领域,自定义进度条对话框是一个常见的需求,特别是在执行长时间操作或者需要用户等待的任务时,为了提供良好的用户体验,开发者通常会设计一个可视化的进度条来展示任务的完成状态。本文将深入探讨如何创建...

    HTML5+CSS3源码_漂亮的CSS3动画进度条 可自定义进度条颜色.rar.rar

    这种进度条不仅可以展示进度,还能通过CSS3实现动态效果,同时允许开发者自定义进度条的颜色,以适应不同网站的设计风格。 HTML5是超文本标记语言的第五个版本,它引入了许多新特性,例如离线存储、拖放功能、媒体...

    自定义进度条&自定义弧形进度条(附带动画效果)

    总结一下,自定义进度条和弧形进度条是提高应用程序用户体验的有效手段。通过HTML5的Canvas API,我们可以灵活地创建这些控件,并添加动态的动画效果。实现过程包括计算弧度、绘制形状、监听用户输入以及利用`...

    安卓进度条loadingprogress相关-自定义进度条自定义逐帧动画进度条让自己的进度条更美观大方。.rar

    本话题主要探讨的是如何自定义进度条(loadingprogress),特别是通过逐帧动画来实现更吸引人的视觉效果。以下将详细介绍相关知识点。 一、自定义进度条(ProgressBar) Android系统自带的ProgressBar虽然能满足...

Global site tag (gtag.js) - Google Analytics