练习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 进度条不能刷新解决方案 (已更新一次)

    java期末考试都考完了,实验课却还没完,课程设计也还没开始做,本来打算把最后两次实验尽快做完,然后好好做课设,(我早就想写的坦克大战,过几天写好了,也肯定要整理发布出来).可却被多线程一题给坑了,题 ...

  2. java时间设置_JAVA中的时间操作

    java中的时间操作不外乎这四种情况: 1.获取当前时间 2.获取某个时间的某种格式 3.设置时间 4.时间的运算 好,下面就针对这四种情况,一个一个搞定. 一.获取当前时间 有两种方式可以获得,第一 ...

  3. java 获取系统时间不对_java new Date()得到的时间和系统时间不一样

    造成这种问题的原因可能是:你的操作系统时区跟你JVM的时区不一致. 你的操作系统应该是中国的时区吧,而JVM的时区不一定是中国时区,你在应用服务器的Java虚拟机添加如下配置: -Dfile.enco ...

  4. java获取mysql时间格式化_Java与mysql的时间格式化问题,获取时间的上下午

    Java与mysql的时间格式化问题,获取时间的上下午java 在项目中常常会遇到对时间进行格式化的问题,一次在对应用中发现,使用Java的SimpleDateFormat格式化时间,获取到的是上午, ...

  5. java 取当前时间年月日_Java获取当前时间年月日的方法

    本文实例为大家分享了java获取当前时间年月日的具体代码,供大家参考,具体内容如下 import java.text.ParseException; import java.text.SimpleDa ...

  6. java 不同时区时间转换_Java对世界不同时区timezone之间时间转换的处理方法

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  7. java怎么给时间赋值_Java 8新时间日期库java.time的使用示例

    Instant--它代表的是时间戳 LocalDate--不包含具体时间的日期,比如 2020-01-14.它可以用来存储生日,周年纪念日,入职日期等. LocalTime--它代表的是不含日期的时间 ...

  8. java的环境变量设置_Java开发环境不再需要配置classpath

    前言: 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候,确实不需要对classpath进行配置,查阅了一些资料以及与别人的交流,今天 ...

  9. java创建具体时间点_java单例饿汉模式对象创建时间点疑问

    关于java单例中饿汉式模式的解释,大多如下: 饿汉模式线程安全的,在类创建的同时就已经创建好一个静态的对象,相对与懒汉模式对象创建过早,浪费空间. 但是jvm中明确定义是:虚拟机规范则是严格规定了有 ...

最新文章

  1. 中国团队 Nature 新冠论文被指图片造假,科研论文不端“何时休”
  2. java中if结构用图表示_Java语法基础之选择结构的if语句、switch语句详解
  3. html页面获取get传递过来的值,在HTML中用js获取通过GET、POST方法(就是在网址后加?a=bc=d之类)传过来的表单值...
  4. MPLS是怎么工作的?
  5. Windows进程与线程学习笔记(三)—— KPCR
  6. ITK:从均匀矩阵应用仿射变换并重新采样
  7. win7变成xp风格了怎么改回_微软看了会沉默,把 Windows 10 变成经典 98 风格
  8. webConfig中System.Web 和 System.WebServer节点读取
  9. QT编译项目错误:转换到coff期间失败文件无效或损坏
  10. 与孩子一起学编程07章
  11. ENVI用ROI进行裁剪
  12. REDIS04_主从复制概述及搭建、反客为主、薪火相传、原理、哨兵模式、集群搭建
  13. Visual Studio安装以及增加工具集C盘占用问题
  14. SICP-Notes-Lecture 19 Macros
  15. java树型结构数据根据条件移除节点(递归方式)
  16. 基于python-flask制作的论坛
  17. Vue实现二选一、菜单更多功能:
  18. 世界500强企业名称中英对照(续)
  19. 用Tableau制作瀑布图及拓展延伸
  20. 英语文字转语音的软件有哪些?推荐三款文字转语音真人发声软件

热门文章

  1. 信息学奥赛C++编程:奥运奖牌计数
  2. python数据类型可变和不可变_python3数据类型–可变与不可变 | 吴老二
  3. ARCore系列教程(1)---创建第一个原生AR应用
  4. ccmall商城:阿里的区块链为阿里代言,可靠,安全,不可篡改
  5. 2022非常全的软件测试linux常用命令全集,linux面试题及参考答案
  6. 精品基于java开发的航空订票系统SSM
  7. 2013年美国大学生数学建模竞赛B题O奖21185论文解读
  8. 各代iphone尺寸_iPhone X尺寸多大?三款iPhone新机尺寸对比!
  9. python 局域网广播_Python实现局域网内屏幕广播的技术要点分析
  10. 一招让你的百度云资源下载速度快10倍!