Swing开发之JProgressBar篇

JProgressBar是一个简单的组件,它一般是一种颜色部分或完全填充的矩形。缺省情况下,进度条配备了一个凹陷的边框,并水平放置。
  进度条还可以选择显示一个字符串,这个字符串在进度条矩形的中央位置上显示。这个字符串缺省时为耗时任务已完成的百分比。这个字符串可用JProgressBar.setString方法定制。
当你在安装一个新软件时,系统会告知你目前软件安装的进度如何?才不会让你觉得程序好像死了,同样的,若你设计的程序所
需要的运行超过2秒以上,你应该显示程序正在运行中的图标,或直接显示程序运行的进度,这样就能让用户清楚知道程序到底是死
了还是继续运行,在swing中,JProgressBar组件提供了类似这样的功能,它可以簋简单地输出进度的变化情况,让你想要提供进度
信息时,不再需要自行绘制绘图组件,只需要使用JProgressBar再加上几行程序设置就可以了。以下是JProgressBar的范例,在此
范例中,我们使用Timer组件当作控制进度杆移动的速度,当用户按下"start"按钮,则进度杆线就会开始向右移动,并显示出目前
的进度信息。每当JProgressBar的值改变一次(利用setValue()方法),就会触发一次ChangeEvent事件,如果你要处理这个事件,
你必须实作ChangeListener界面所定义的stateChanged()方法,在此我们是将JPogressBar的移动信息放在label上。

构造函数
JProgressBar()
          创建一个显示边框但不带进度字符串的水平进度条。
JProgressBar(BoundedRangeModel newModel)
          创建使用指定的保存进度条数据模型的水平进度条。
JProgressBar(int orient)
          创建具有指定方向(JProgressBar.VERTICAL 或 JProgressBar.HORIZONTAL)的进度条。
JProgressBar(int min, int max)
          创建具有指定最小值和最大值的水平进度条。
JProgressBar(int orient, int min, int max)
          创建使用指定方向、最小值和最大值的进度条。

常用方法
addChangeListener(ChangeListener l)
          将指定的 ChangeListener 添加到进度条。
getMaximum()
          返回进度条的最大值,该值存储在进度条的 BoundedRangeModel 中。
getMinimum()
          返回进度条的最小值,该值存储在进度条的 BoundedRangeModel 中。
getModel()
          返回此进度条使用的数据模型。
getString()
          返回进度字符串的当前值。
getValue()
          返回进度条的当前值,该值存储在进度条的 BoundedRangeModel 中。
setBorderPainted(boolean b)
          设置 borderPainted 属性,如果进度条应该绘制其边框,则此属性为 true。
setMaximum(int n)
          将进度条的最大值(存储在进度条的数据模型中)设置为 n。
setMinimum(int n)
          将进度条的最小值(存储在进度条的数据模型中)设置为 n。
setModel(BoundedRangeModel newModel)
          设置 JProgressBar 使用的数据模型。
setString(String s)
          设置进度字符串的值。
setValue(int n)
          将进度条的当前值(存储在进度条的数据模型中)设置为 n。
setUI(ProgressBarUI ui)
          设置呈现此组件的外观对象。

例 1:向JProgressBar设置值
Java代码
import java.awt.BorderLayout;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
 
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JProgressBar;  
 
public class JProgressBarSetValue extends JFrame {  
  JProgressBar bar = new JProgressBar();  
  JButton step = new JButton("Step");  
 
  public JProgressBarSetValue() {  
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    step.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) {  
        int value = bar.getValue() + 7;  
        if (value > bar.getMaximum()) {  
          value = bar.getMaximum();  
        }  
        bar.setValue(value);  
      }  
    });  
 
    getContentPane().add(bar, BorderLayout.NORTH);  
    getContentPane().add(step, BorderLayout.EAST);  
    pack();  
    setVisible(true);  
  }  
 
  public static void main(String arg[]) {  
    new JProgressBarSetValue();  
  }  


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class JProgressBarSetValue extends JFrame {
  JProgressBar bar = new JProgressBar();
  JButton step = new JButton("Step");

  public JProgressBarSetValue() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    step.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        int value = bar.getValue() + 7;
        if (value > bar.getMaximum()) {
          value = bar.getMaximum();
        }
        bar.setValue(value);
      }
    });

    getContentPane().add(bar, BorderLayout.NORTH);
    getContentPane().add(step, BorderLayout.EAST);
    pack();
    setVisible(true);
  }

  public static void main(String arg[]) {
    new JProgressBarSetValue();
  }
}

例 2:用线程控制JProgressBar进度
Java代码
import java.awt.BorderLayout;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
 
import javax.swing.JButton;  
import javax.swing.JFrame;  
import javax.swing.JProgressBar;  
 
public class ProgressBarStep {  
  static class BarThread extends Thread {  
    private static int DELAY = 500;  
 
    JProgressBar progressBar;  
 
    public BarThread(JProgressBar bar) {  
      progressBar = bar;  
    }  
 
    public void run() {  
      int minimum = progressBar.getMinimum();  
      int maximum = progressBar.getMaximum();  
      for (int i = minimum; i < maximum; i++) {  
        try {  
          int value = progressBar.getValue();  
          progressBar.setValue(value + 1);  
 
          Thread.sleep(DELAY);  
        } catch (InterruptedException ignoredException) {  
        }  
      }  
    }  
  }  
 
  public static void main(String args[]) {  
    JFrame frame = new JFrame("Stepping Progress");  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    final JProgressBar aJProgressBar = new JProgressBar(0, 50);  
    aJProgressBar.setStringPainted(true);  
  aJProgressBar.setBackground(Color.orange);  
  aJProgressBar.setForeground(Color.red);  
 
    final JButton aJButton = new JButton("Start");  
 
    ActionListener actionListener = new ActionListener() {  
      public void actionPerformed(ActionEvent e) {  
        aJButton.setEnabled(false);  
        Thread stepper = new BarThread(aJProgressBar);  
        stepper.start();  
      }  
    };  
    aJButton.addActionListener(actionListener);  
    frame.add(aJProgressBar, BorderLayout.NORTH);  
    frame.add(aJButton, BorderLayout.SOUTH);  
    frame.setSize(300, 200);  
    frame.setVisible(true);  
  }  


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class ProgressBarStep {
  static class BarThread extends Thread {
    private static int DELAY = 500;

    JProgressBar progressBar;

    public BarThread(JProgressBar bar) {
      progressBar = bar;
    }

    public void run() {
      int minimum = progressBar.getMinimum();
      int maximum = progressBar.getMaximum();
      for (int i = minimum; i < maximum; i++) {
        try {
          int value = progressBar.getValue();
          progressBar.setValue(value + 1);

          Thread.sleep(DELAY);
        } catch (InterruptedException ignoredException) {
        }
      }
    }
  }

  public static void main(String args[]) {
    JFrame frame = new JFrame("Stepping Progress");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JProgressBar aJProgressBar = new JProgressBar(0, 50);
    aJProgressBar.setStringPainted(true);
  aJProgressBar.setBackground(Color.orange);
  aJProgressBar.setForeground(Color.red);

    final JButton aJButton = new JButton("Start");

    ActionListener actionListener = new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        aJButton.setEnabled(false);
        Thread stepper = new BarThread(aJProgressBar);
        stepper.start();
      }
    };
    aJButton.addActionListener(actionListener);
    frame.add(aJProgressBar, BorderLayout.NORTH);
    frame.add(aJButton, BorderLayout.SOUTH);
    frame.setSize(300, 200);
    frame.setVisible(true);
  }
}

例 3:获取JProgressBar值改变状况
Java代码
import java.awt.BorderLayout;  
import java.awt.Insets;  
import java.awt.Toolkit;  
import java.awt.event.ActionEvent;  
import java.awt.event.ActionListener;  
import java.beans.PropertyChangeEvent;  
import java.beans.PropertyChangeListener;  
import java.util.Random;  
 
import javax.swing.BorderFactory;  
import javax.swing.JButton;  
import javax.swing.JComponent;  
import javax.swing.JFrame;  
import javax.swing.JPanel;  
import javax.swing.JProgressBar;  
import javax.swing.JScrollPane;  
import javax.swing.JTextArea;  
import javax.swing.SwingWorker;  
 
public class ProgressBarDemo2 extends JPanel implements ActionListener,  
    PropertyChangeListener {  
 
  private JProgressBar progressBar;  
  private JButton startButton;  
  private JTextArea taskOutput;  
  private Task task;  
 
  class Task extends SwingWorker<Void, Void> {  
    /* 
     * Main task. Executed in background thread. 
     */ 
    @Override 
    public Void doInBackground() {  
      Random random = new Random();  
      int progress = 0;  
      // Initialize progress property.  
      setProgress(0);  
      // Sleep for at least one second to simulate "startup".  
      try {  
        Thread.sleep(1000 + random.nextInt(2000));  
      } catch (InterruptedException ignore) {  
      }  
      while (progress < 100) {  
        // Sleep for up to one second.  
        try {  
          Thread.sleep(random.nextInt(1000));  
        } catch (InterruptedException ignore) {  
        }  
        // Make random progress.  
        progress += random.nextInt(10);  
        setProgress(Math.min(progress, 100));  
      }  
      return null;  
    }  
 
    /* 
     * Executed in event dispatch thread 
     */ 
    public void done() {  
      Toolkit.getDefaultToolkit().beep();  
      startButton.setEnabled(true);  
      taskOutput.append("Done!\n");  
    }  
  }  
 
  public ProgressBarDemo2() {  
    super(new BorderLayout());  
 
    // Create the demo's UI.  
    startButton = new JButton("Start");  
    startButton.setActionCommand("start");  
    startButton.addActionListener(this);  
 
    progressBar = new JProgressBar(0, 100);  
    progressBar.setValue(0);  
 
    // Call setStringPainted now so that the progress bar height  
    // stays the same whether or not the string is shown.  
    progressBar.setStringPainted(true);  
 
    taskOutput = new JTextArea(5, 20);  
    taskOutput.setMargin(new Insets(5, 5, 5, 5));  
    taskOutput.setEditable(false);  
 
    JPanel panel = new JPanel();  
    panel.add(startButton);  
    panel.add(progressBar);  
 
    add(panel, BorderLayout.PAGE_START);  
    add(new JScrollPane(taskOutput), BorderLayout.CENTER);  
    setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));  
  }  
 
  /** 
   * Invoked when the user presses the start button. 
   */ 
  public void actionPerformed(ActionEvent evt) {  
    progressBar.setIndeterminate(true);  
    startButton.setEnabled(false);  
    // Instances of javax.swing.SwingWorker are not reusuable, so  
    // we create new instances as needed.  
    task = new Task();  
    task.addPropertyChangeListener(this);  
    task.execute();  
  }  
 
  /** 
   * Invoked when task's progress property changes. 
   */ 
  public void propertyChange(PropertyChangeEvent evt) {  
    if ("progress" == evt.getPropertyName()) {  
      int progress = (Integer) evt.getNewValue();  
      progressBar.setIndeterminate(false);  
      progressBar.setValue(progress);  
      taskOutput.append(String.format("Completed %d%% of task.\n", progress));  
    }  
  }  
 
  /** 
   * Create the GUI and show it. As with all GUI code, this must run on the 
   * event-dispatching thread. 
   */ 
  private static void createAndShowGUI() {  
    // Create and set up the window.  
    JFrame frame = new JFrame("ProgressBarDemo2");  
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
 
    // Create and set up the content pane.  
    JComponent newContentPane = new ProgressBarDemo2();  
    newContentPane.setOpaque(true); // content panes must be opaque  
    frame.setContentPane(newContentPane);  
 
    // Display the window.  
    frame.pack();  
    frame.setVisible(true);  
  }  
 
  public static void main(String[] args) {  
    // Schedule a job for the event-dispatching thread:  
    // creating and showing this application's GUI.  
    javax.swing.SwingUtilities.invokeLater(new Runnable() {  
      public void run() {  
        createAndShowGUI();  
      }  
    });  
  }  



你可能感兴趣的:(java,thread,UI,swing,UP)