我只是想迭代 for 循环并在循环内更新JProgressBar
的值,启动SwingUtilities.invokeLater
.但它只是在完成后更新。下面是我的简单代码:
import java.awt.Color;
import java.awt.Rectangle;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ProgressBar extends JApplet {
JProgressBar pg = null;
JPanel panel = null;
JButton start = null;
int i;
public void init() {
pg = new JProgressBar(0, 100);
pg.setStringPainted(true);
this.setSize(1200, 600);
this.setLayout(null);
panel = new JPanel();
panel.setLayout(null);
panel.setBackground(Color.white);
this.setContentPane(panel);
this.setVisible(true);
pg.setBounds(new Rectangle(630, 20, 150, 30));
add(pg);
start = new JButton("start");
start.setBounds(new Rectangle(330, 20, 200, 30));
start.setBackground(Color.lightGray);
panel.add(start);
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
pg.setValue(0);
pg.setStringPainted(true);
for (i = 0; i <= 100; i = i + 1) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
pg.setValue(i);
java.lang.Thread.sleep(100);
} catch (Exception e) {}
}
});
}
}
});
}
}
如何以递增的方式反映progress bar
的更新,因为它在循环完成后仅更新 100%。
您必须在单独的线程中处理任何计算/处理内容,并在事件调度线程 (EDT) 中更新 UI:
start.addActionListener ( new ActionListener ()
{
public void actionPerformed ( ActionEvent e )
{
pg.setValue ( 0 );
pg.setStringPainted ( true );
new Thread ( new Runnable ()
{
public void run ()
{
for ( i = 0; i <= 100; i = i + 1 )
{
SwingUtilities.invokeLater ( new Runnable ()
{
public void run ()
{
pg.setValue ( i );
}
} );
try
{
java.lang.Thread.sleep ( 100 );
}
catch ( Exception e )
{
//
}
}
}
} ).start ();
}
} );
任何操作/鼠标/键和其他侦听器方法始终在 EDT 线程中执行,因此您必须将代码移动到单独的线程中。否则,您将在 EDT 线程内执行所有计算/处理(这会导致 UI 卡住)。
您正在阻止EDT(事件调度线程),这就是进度条无法自行更新的原因。你的 for 循环将在 EventQueue 上推送 100 个 InvoEvent。这 100 个事件将按照您将它们放入队列的顺序发生。更新该值时,将在 EventQueue 上推送重绘事件,但该重绘事件仅在执行完所有 InvocationEvent 后才会发生。
- 永远不要在EDT中放置Thread.sleep(它会阻止UI并提供糟糕的用户体验)
- 将长期运行的操作放入 SwingWorker 中
- 或者使用摆动计时器执行重复性任务