`
jdluojing
  • 浏览: 18010 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

java进度条

 
阅读更多

练习JProgressBar结合Timer使用。

代码如下:

package luojing;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;

public class NewClass
{
	static JProgressBar jpb = null;
	static JButton jb = null;

	public static void main(String args[])
	{
		JFrame frm = new JFrame();
		Container contentPane = frm.getContentPane();
		jpb = new JProgressBar();
		jpb.setOrientation(JProgressBar.HORIZONTAL);
		jpb.setMaximum(100);
		jpb.setMinimum(0);
		jpb.setValue(0);
		jpb.setStringPainted(true);
		jpb.setPreferredSize(new Dimension(400, 50));
		contentPane.add(jpb, BorderLayout.CENTER);
		jb = new JButton("开始");
		jb.addActionListener(new Change());
		contentPane.add(jb, BorderLayout.SOUTH);
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.pack();
		frm.setTitle("进度条");
		// 窗口居中
      frm.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - frm.getSize()
      .width) / 2,(Toolkit.getDefaultToolkit().getScreenSize().height - frm.getSize().height) / 2);
		frm.setVisible(true);
	}

	static class Change implements ActionListener
	{

		public void actionPerformed(ActionEvent e)
		{

			Timer timer = new Timer();
			timer.schedule(new mytask(jpb), 100, 100);
			jb.setEnabled(false);

			// 下面这种方法达不到预定效果,因为线程sleep()时用户界面也不会响应,只会在actionPerformde()执行结束后才会响应

			/*
			 * for (int i = 0; i <= 100; i++) { try { Thread.sleep(100);
			 * 
			 * jpb.setValue(i);
			 * 
			 * } catch (InterruptedException e1) { e1.printStackTrace(); }
			 * 
			 * }
			 */
			// 采用新建一个一个线程来执行累加可以达到预定的效果
			/*
			 * new Thread(new Runnable() { public void run() { for (int i = 1; i
			 * <=100; i++) { try { Thread.sleep(100); jpb.setValue(i); } catch
			 * (InterruptedException ie) { } } } }).start();
			 */

		}
	}
}

class mytask extends TimerTask
{
	JProgressBar jpb = null;
	int i = 1;

	public mytask(JProgressBar jp)
	{
		this.jpb = jp;
	}

	public void run()
	{
		this.jpb.setValue(i++);
	}
}


另附(转):

java中进度条不能更新问题的研究


为什么进度条在事件处理过程中不更新,而是在完成后,从0%调到100%?
分两种情况:
1)在AWT事件线程中执行的操作
当 应用程序在事件线程中执行长时间的操作时,会阻塞正常的AWT事件处理,因此阻止了重绘操作的发生。这同常会在下列情况下发生:应用程序响应一个来自用户 界面的请求时,在连接到一个按钮或其他GUI组件的事件处理程序中执行任务,任务的内容可能会需要较长时间,使事件线程挂起,直至远程系统发出答复为止。 当应用程序调用JProgressBar的setValue方法时,进度条可能更新期内部状态并调用repaint,这样做会把一个事件放置到AWT事件 队列中。不幸的是,直至应用程序的事件处理程序完成其处理并把控制权返回到线程的事件处理循环,才能处理该事件。
可以通过调用JComponent的paintImmediately方法来这样做,该方法有两种形式:
public void paintImmediately(int x, int y, int width, int height);
public void paintImmediately(Rectangel rect);
例如:
Dimension d = bar.getSize();
Rectangel rect = new Rectangle(0,0, d.width, d.height);
...
bar.setValue(progressValue);
bar.paintImmediately(rect);
...
2)在另一个线程中执行的操作
如 果在一个单独的线程中执行该操作,当调用进度条的setValue方法,它的更新不会出现任何问题,问题在于,后台线程必须调用JProgressBar 的setValue。而Swing组件只有在事件线程中才能安全的访问。因此,从执行实际工作的线程调用setValue方法是不安全的!解决的方法是使 用SwingUtilites的invokeLater方法,让AWT事件线程稍后进行setValue调用。
例如:
...
SwingUtilities.invokeLater(new Runnable() {
public void run() {
bar.setValue(value);
}
});
...
还有一种可能,不能再线程中改变swing组件,例如,不能从线程调用label.setText,但是可以使用EventQueue类的invokeLater和invokeAndWait方法,以便在事件调度线程中执行该调用程序。

分享到:
评论

相关推荐

    JAVA进度条源代码

    Java进度条是用户界面(UI)设计中常见的一种元素,用于提供给用户关于长时间运行任务的进度反馈。在Java编程中,我们可以使用Java Swing或JavaFX库来创建进度条。以下将详细介绍如何在Java中实现进度条功能,以及...

    java进度条设计源代码

    本资源包含三个不同版本的Java进度条设计源代码:进度条.txt、进度条2.txt、进度条3.txt,它们可能代表了三种不同的实现方式或功能增强。 首先,我们要理解Java中的进度条通常是通过JProgressBar组件来实现的,它是...

    java 进度条的实现

    实现Java进度条主要涉及GUI(图形用户界面)和多线程技术。以下是对Java进度条实现的详细解释: 1. **Swing和AWT库**:在Java中,我们通常使用Swing或AWT库来创建图形用户界面,这两个库提供了丰富的组件,包括...

    java进度条的使用视频

    Java进度条是GUI(图形用户界面)编程中一个常见的组件,通常用于在执行长时间操作时向用户显示任务的进度,从而提高用户体验。本教程将详细讲解如何在Java中使用进度条,以配合视频学习。 首先,Java中的进度条...

    Java 进度条的使用 有暂停 和 继续

    ### Java 进度条的使用:包含暂停与继续功能 在Java编程中,进度条(`JProgressBar`)是Swing组件中一个非常实用的工具,它可以用来显示任务的完成情况,为用户提供直观的任务进度反馈。本文将详细介绍如何在Java...

    java进度条排序程序

    进度条 3种排序功能选择 可以输入数据或产生随机数

    Java进度条的使用视频

    总的来说,"Java进度条的使用"视频教程将涵盖这些概念,并通过实例演示如何在实际项目中应用。通过学习这个教程,你将能够熟练地创建和管理Java应用程序中的进度条,提升程序的交互性和用户体验。无论你是Java初学者...

    Jindutiao.rar_java进度条

    总的来说,"Jindutiao.rar_java进度条" 文件提供的代码示例可能会帮助你理解和实现 Java GUI 应用中的进度条功能,无论是在 Swing 还是 JavaFX 平台上。通过学习和理解这些代码,你可以更好地掌握如何在自己的项目中...

    java 进度条文件上传

    在Java编程中,实现文件上传进度条功能是一项常见的需求,特别是在处理大文件或者批量上传时,用户界面的反馈显得尤为重要。进度条不仅提高了用户体验,也能让用户了解任务的执行状态,从而减少用户对程序运行时间的...

    java 进度条上传 源码

    "java 进度条上传 源码"这个主题涉及到一个技术问题,即如何在Java Web应用程序中实现文件上传并同时显示进度条,以提供更好的用户体验。在描述中提到,此源码实例是基于JSP和SWFUpload库来实现这一功能的,同时支持...

    java 进度条

    ### Java进度条实现详解 在IT项目开发中,特别是在处理大量数据或长时间运行的任务时,提供用户反馈至关重要。本文将深入探讨如何在Java项目中利用Ajax实现进度条,以提升用户体验,具体通过以下两个步骤: #### ...

    Java实现显示进度条

    ### Java 实现显示进度条 #### 背景与需求 在软件开发过程中,特别是涉及到长时间运行的任务时,向用户展示任务完成进度是一项非常实用的功能。进度条是实现这一功能的一种常见方式。本文将详细介绍如何使用Java...

    Java进度条程序

    Java进度条程序是一种在用户界面中显示任务执行进度的图形元素,它有助于提供更好的用户体验,让用户知道后台进程的状态。在Java中实现进度条通常涉及到线程处理和GUI更新,这通常通过Swing或JavaFX库完成。在这个...

    Java快速实现的进度条

    使用JProgressBar和SwingWorker做的Java进度条 简单方便 效果看这里:http://blog.csdn.net/kakashi8841/archive/2011/05/03/6388797.aspx

    Java 进度条制作

    在Java Web开发中,制作进度条通常涉及到前端与后端的交互,以及多线程的运用。本示例以"Java 进度条制作"为主题,通过JSP(JavaServer Pages)来展示一个动态更新的进度条效果。下面将详细阐述相关知识点。 1. **...

    jindutiao.rar_gif_gif jinduti_java gif_java 进度条_进度条 java

    标签中的“java_gif”和“java_进度条”强调了这个主题的核心技术,即使用Java语言处理GIF动画以及创建进度条。在实际项目中,开发者还需要考虑到性能优化,因为持续地加载和绘制GIF可能会消耗大量资源,尤其是在...

    简单的java进度条

    用java实现了简单的进度条显示,只有开始,无法暂停和继续,适用于再次开发。

    java实现进度条.pdf

    Java进度条是指在Java GUI开发中,使用JProgressBar组件来显示进度的控件。JProgressBar可以显示进度的百分比,例如下载文件、安装软件等过程中,JProgressBar可以实时显示当前进度。 在本例中,我们使用了...

    SuperMap Objects Java 进度条

    本示例主要关注的是在Java环境中使用SuperMap Objects实现数据导入时的进度条功能。进度条在用户界面设计中扮演着重要角色,它能够为用户提供实时的操作反馈,提升用户体验。 首先,让我们深入理解`iObjects Java`...

Global site tag (gtag.js) - Google Analytics