练习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++);

}

}

另附(转):

为什么进度条在事件处理过程中不更新,而是在完成后,从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进度条相关推荐

  1. java 数据库插入数据_java向数据库插入N条数据

    packageaction;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;import ...

  2. java 数据库操作教程_java操作数据库的基本方法

    此次开发工具为eclipse,才有的数据库驱动是mysql-connector-java-5.1.8-bin.jar 第一步,在eclipse的工程目录中引用mysql驱动 驱动下载地址:https: ...

  3. java 数据库操作代码_JAVA:对数据库的一系列操作代码

    插入数据 import java.sql.*;/** * @version 2012-02-22 * @author*/ public classInsertDemo {public static v ...

  4. java数据库设计工具_Java课程设计---创建数据库工具类

    1.传统的数据库操作 package com.java.mysql; import java.sql.Connection; import java.sql.DriverManager; import ...

  5. java 数据库 事务 只读_java – odd SQLException – 无法检索转换只读状态服务器

    我有一个 Quartz作业,每5分钟一次在MySQL数据库中执行一个存储过程,由于某种原因,3个执行中有1个失败,并提供了这个奇怪的异常.我搜索并搜索了这个异常是什么意思,但是我找不到解决方案.这是完 ...

  6. java 数据库 异常类型_Java基础 -- 常见异常

    1.常见异常 Exception 类是 Throwable 类的子类.除了Exception类外,Throwable还有一个子类Error . 异常类有两个主要子类:IOException和Runti ...

  7. java 数据库并发访问_java – 提供IllegalStateException的并发数据库访问

    我试图只为1个方法生成一个线程.我得到一个IllegalStateException(见下文).这个方法接受数据库连接和数据库名称,它将从中生成 XML. (那部分可行,我只是想通过一个新线程让它更快 ...

  8. java数据库程序实例_Java连接各种数据库的实例大全

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(): ...

  9. java进度条_Java web实时进度条整个系统共用(如java上传、下载进度条、导入、导出excel进度条等)...

    先上图: 文件上传的: 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 2019-03-26更新进度条显示体验 从服务器上压缩下载: 从 ...

最新文章

  1. 隐马尔科夫模型HMM(一)HMM模型
  2. [转]学习Objective-C: 入门教材
  3. numpy shape函数
  4. dao层和service层和control_maven分模块构建SSM普通web项目:service层代码编写
  5. splunk rest api search
  6. 深入理解分布式技术 - 消息队列知识点回顾总结
  7. java 栈 队列 接口_Java队列接口
  8. 一些有关系统APK的探索(一)
  9. Go 远超 Python,机器学习人才极度稀缺,全球 16,655 位程序员告诉你这些真相!...
  10. a标签创建超链接,利用a标签创建锚点
  11. 《简约之美:软件设计之道》总结
  12. 给editplus加一个主题
  13. 计算机网络工程综合布线目的,浅谈网络工程综合布线系统
  14. HTML5 如何让背景图片自适应浏览器大小
  15. 51单片机控制数码管显示hello,012345,以及apple自动切换
  16. linux命令看进程的tcp链接,Linux下查看TCP连接的状态的shell命令
  17. javascript实现日历功能
  18. fir.im Weekly - 如何打造 Github 「爆款」开源项目
  19. 【数据结构-堆栈(顺序存储)GO语言实现】
  20. 新颖的自我介绍_精选简单新颖的自我介绍

热门文章

  1. 数模写作必备利器—latex
  2. redis rua解决库存问题_如何解决高并发下的库存安全问题,没你想得那么复杂(附源码)...
  3. struts2 redirect 获取参数null_社会化登录支持授权域以便于获取更大权限
  4. 【年度回忆录】如何做到1年90000粉丝?
  5. Java8 Stream详解~ 提取/组合
  6. 用php编写xml,PHP 读取和编写 XML
  7. 上古卷轴5json文件修改_【白夜谈】我做了一款失败的《社长卷轴》Mod
  8. 系统鸿蒙生态链,任正非透露鸿蒙系统细节,比安卓速度快60%,两三年建好生态链...
  9. 计算机考试用英语怎么说,“全国大学生计算机等级考试一级”英语怎么说?
  10. 点在不规则图形内算法python_目标检测算法中规则矩形和不规则四边形IOU的Python实现...