📄 progressbardemo.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ProgressBarDemo extends JPanel
implements ActionListener {
public final static int ONE_SECOND = 1000;
private JProgressBar progressBar;
private Timer timer;
private JButton startButton;
private LongTask task;
public ProgressBarDemo() {
super(new BorderLayout());
task = new LongTask();
//创建用户界面
startButton = new JButton("开始");
startButton.addActionListener(this);
progressBar = new JProgressBar(0, task.getLengthOfTask());
progressBar.setValue(0);
progressBar.setStringPainted(true);
JPanel panel = new JPanel();
panel.add(startButton);
panel.add(progressBar);
add(panel, BorderLayout.CENTER);
//创建定时器
timer = new Timer(ONE_SECOND, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
progressBar.setValue(task.getCurrent());
if (task.isDone()) {
Toolkit.getDefaultToolkit().beep();
timer.stop();
startButton.setEnabled(true);
setCursor(null); //关闭等待光标
progressBar.setValue(progressBar.getMinimum());
}
}
});
} /*当按下开始按钮时开始调用*/
public void actionPerformed(ActionEvent evt) {
startButton.setEnabled(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
task.go(); timer.start();
} /*创建用户窗口.为了线程安全,这个方法应该被事件处理线程调用*/
private static void createAndShowGUI() {
JFrame frame = new JFrame("进度条示例");//创建和设置窗口
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建和设置内容框
JComponent newContentPane = new ProgressBarDemo();
newContentPane.setOpaque(true); //应试是不透明的。
frame.setContentPane(newContentPane);
frame.pack(); //显示窗口
frame.setVisible(true);
}
public static void main(String[] args) {
//创建和显示程序的用户界面,为事件处理线程提供事件
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() { createAndShowGUI();}
});
}
}
class LongTask {
private int lengthOfTask;
private int current = 0;
private boolean done = false;
private boolean canceled = false;
public LongTask() { //计算进度
lengthOfTask = 1000;
} /*开始任务*/
public void go() {
final SwingWorker worker = new SwingWorker() {
public Object construct() {
current = 0; done = false;
canceled = false;
return new ActualTask();
}
};
worker.start();
} /*查看有多少任务需要去做*/
public int getLengthOfTask() { return lengthOfTask; }
/*查看完成的多少*/
public int getCurrent() { return current; }
public void stop() { canceled = true; }
/*被ProgressBarDemo调用,查看任务是否完成*/
public boolean isDone() { return done;}
/*返回最新状态信息,如果没有返回null*实在的常运行任务,在SwingWorker中运行*/
class ActualTask {
ActualTask() { //创建随机数量的进度
while (!canceled && !done) {
try {
Thread.sleep(1000); //挂起一秒
current += Math.random() * 100; //做进度条
if (current >= lengthOfTask) {
done = true;
current = lengthOfTask;
}
} catch (InterruptedException e) {
System.out.println("ActualTask interrupted");
}
}
}
}
}
abstract class SwingWorker {
private Object value; // 看 getValue(), 看 Value()
/*在分开的同步控制下维持worker线程的引用*/
private static class ThreadVar {
private Thread thread;
ThreadVar(Thread t) { thread = t; }
synchronized Thread get() { return thread; }
synchronized void clear() { thread = null; }
}
private ThreadVar threadVar;
/*取得worker产生的值,如果还没有创建返回null*/
protected synchronized Object getValue() {
return value;
}/*设置worker线程产生的值*/
private synchronized void setValue(Object x) {
value = x;
} /*计算返回值*/
public abstract Object construct();
/*构造光方法返回后,调用事件发送线程*/
public void finished() { }
/*新方法,打断现在工作线程,而不管他在做什么.*/
public void interrupt() {
Thread t = threadVar.get();
if (t != null) { t.interrupt(); }
threadVar.clear();
} /*返回构造函数的值,如果被中断返回null*/
public Object get() {
while (true) {
Thread t = threadVar.get();
if (t == null) { return getValue();}
try { t.join();}
catch (InterruptedException e) {
Thread.currentThread().interrupt(); //宣传
return null;
}
}
} /*调用构造函数,然后退出*/
public SwingWorker() {
final Runnable doFinished = new Runnable() {
public void run() { finished(); }
};
Runnable doConstruct = new Runnable() {
public void run() {
try {setValue(construct());}
finally { threadVar.clear();}
SwingUtilities.invokeLater(doFinished);
}
};
Thread t = new Thread(doConstruct);
threadVar = new ThreadVar(t);
} /*开始worker线程*/
public void start() {
Thread t = threadVar.get();
if (t != null) { t.start();}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -