java 进度条怎么关联一个thread
时间: 2023-08-21 21:06:37 浏览: 165
在Java中,我们可以使用SwingWorker来将进度条与一个后台线程关联起来。SwingWorker是一个抽象类,它封装了后台线程和Swing GUI之间的交互,可以很方便地实现进度条的更新。
以下是一个使用SwingWorker和JProgressBar实现进度条更新的例子:
```java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
public class ProgressBarDemo {
private static final int MAX_PROGRESS = 100;
private JProgressBar progressBar;
private JLabel progressLabel;
public static void main(String[] args) {
ProgressBarDemo demo = new ProgressBarDemo();
demo.createUI();
}
public void createUI() {
JFrame frame = new JFrame("进度条示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
progressLabel = new JLabel("进度:");
progressBar = new JProgressBar(0, MAX_PROGRESS);
progressBar.setStringPainted(true);
panel.add(progressLabel);
panel.add(progressBar);
frame.add(panel);
frame.setSize(300, 100);
frame.setVisible(true);
Task task = new Task();
task.execute();
}
class Task extends SwingWorker<Void, Integer> {
@Override
protected Void doInBackground() throws Exception {
int progress = 0;
while (progress < MAX_PROGRESS) {
Thread.sleep(1000);
progress += 10;
setProgress(progress);
}
return null;
}
@Override
protected void done() {
progressLabel.setText("完成!");
}
@Override
protected void process(java.util.List<Integer> chunks) {
for (int chunk : chunks) {
progressBar.setValue(chunk);
}
}
}
}
```
在这个例子中,我们首先创建了一个JFrame,其中包含一个JPanel,JPanel包含一个JLabel和一个JProgressBar。然后我们创建了一个Task类,它继承自SwingWorker,实现了doInBackground、done和process方法。在doInBackground方法中,我们模拟了一个长时间运行的任务,每隔1秒钟更新一次进度,通过调用setProgress方法来更新进度。在done方法中,我们设置进度条为“完成”。在process方法中,我们通过调用setValue方法来更新进度条的值。
在createUI方法中,我们创建了一个Task对象,并调用了它的execute方法来启动后台任务。这样,进度条就会自动更新了。
这是一个比较完整的例子,演示了如何使用SwingWorker和JProgressBar来实现进度条的更新。
阅读全文