Java 数据库进度条_java进度条

Java 数据库进度条_java进度条练习 JProgressBar 结合 Timer 使用 代码如下 packageluoji importjava awt importjava awt event importjavax swing importjava util Timer importjava util TimerTask publicclassN staticJProgr

练习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方法,以便在事件调度线程中执行该调用程序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201376.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:31
下一篇 2026年3月20日 上午9:31


相关推荐

  • iphone android换机助手下载,安卓苹果换机助手[通俗易懂]

    iphone android换机助手下载,安卓苹果换机助手[通俗易懂]安卓苹果换机助手软件由腾讯团队专业打造的一款单品,它可以帮助你的手机自由换机,把各种信息文件都一次转换到新手机中去,安卓苹果换机助手无需联网,不耗费手机流量,传输速度快。功能介绍支持各主流品牌和厂商设备极速秒传。一键轻松换机,支持通讯录、软件、短信、文件、通话记录、书签、图片、音乐、视频、日程等多种数据传输。功能特色【数据全面】支持数据全面,基本覆盖常见的手机各种数据类型,包括图片、视频、联系人、…

    2022年5月9日
    115
  • mac OCR截图文字识别工具—iText for mac[通俗易懂]

    mac OCR截图文字识别工具—iText for mac[通俗易懂]iTextformac中文版是Macos系统上一款从图片中识别文字的OCR(光学字符识别)工具。通过截图、拖拽图片,即可以从扫描版的PDF等任意图片中识字,并且可以很好的解决摘抄和批注需求。帮助用户识别图片中文字,节约时间,提高效率。iTextformac下载安装教程…

    2022年5月30日
    54
  • elasticsearch更新数据效率_elasticsearch update_by_query

    elasticsearch更新数据效率_elasticsearch update_by_query    es批量update远比,批量get,或者单次query到文档,批量修改后,再批量index,这样效率会高非常多(有实验测试高达1000倍!)。

    2026年1月29日
    5
  • MSN协议

    MSN协议声明原文请见 http www hypothetic org docs msn index php 翻译中有改删 仅作学习用途 本人英文水平较差 只是凭着一腔热忱及毅力 勉强算翻译完毕 其中有若干意义描述模糊 不清楚之处请见原文 不喜请不要责怪 请当垃圾删除 我是 MSN 的初学者 欢迎上 MSN 与我交流 地址为 2 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 概述 2

    2026年3月18日
    4
  • 常见电子元器件的常用品牌汇总

    ​抽时间汇总了一些常见电子元器件常用品牌,大家在元器件选型时可以参考。电阻:Yageo国巨、Uniohm厚声、Walsin华新科、Fenghua风华、Ralec旺诠、KOA兴亚、Panasonic松下、AVX、Rohm罗姆、Samsung三星、TDK、TMTEC泰铭、Kyocera京瓷、PHYCOM飞元。电容:Yageo国巨、Samsung三星、Eyang宇阳、Murata村田、Taiyo太诱、Fenghua风华、Kyocera京瓷、HEC禾伸堂、Kemet基美、ISND华信安、AVX、TDK、Nich

    2022年4月4日
    84
  • python的取余算法原理_python.取余算法

    python的取余算法原理_python.取余算法#-*-coding:utf-8-*-”’Createdon2012-12-28取余。取一个任意小于1美元的金额,然后计算可以换成最少多少枚硬币。硬币有1美分,5美分,10美分,25美分四种。1美元等于100美分。举例来说,0.76美元换算结果应该是3枚25美分,1枚1美分。类似76枚1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的…

    2022年4月25日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号