⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 progressbardemo.java

📁 压缩包内是近180多个针对Java初学者编写的简单实例
💻 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 + -