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方法,以便在事件调度线程中执行该调用程序。(From Core Java)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 使用进度条可以通过使用 JProgressBar 类来实现。JProgressBar 是 Swing 组件库的一个组件,可以用于显示任务的进度。 以下是一个简单的示例代码,演示如何在 Java 使用 JProgressBar: ```java import javax.swing.*; import java.awt.*; public class ProgressBarExample extends JFrame { private JProgressBar progressBar; public ProgressBarExample() { super("进度条示例"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); progressBar = new JProgressBar(0, 100); progressBar.setValue(0); progressBar.setStringPainted(true); getContentPane().setLayout(new FlowLayout()); getContentPane().add(progressBar); setSize(300, 100); setLocationRelativeTo(null); setVisible(true); simulateTask(); } private void simulateTask() { for(int i = 0; i <= 100; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } progressBar.setValue(i); } } public static void main(String[] args) { new ProgressBarExample(); } } ``` 在上面的示例,我们创建了一个 JFrame 窗口,并在其添加了一个 JProgressBar 组件。我们使用了 setValue() 方法来更新进度条的值,并使用了 setStringPainted() 方法来显示进度条的百分比值。 在 simulateTask() 方法,我们模拟了一个耗时的任务,并在其使用了 Thread.sleep() 方法来暂停 100 毫秒,以便能够看到进度条的变化效果。 当你运行这个示例程序时,你会看到一个进度条,它的值会从 0% 逐渐变化到 100%,表示模拟任务的进度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值