Swing顯示不確定的進度條

2019-10-16 22:05:16

下面的範例展示如何在Java Swing應用程式中顯示不確定的進度條。

使用以下API -

  • JProgressBar - 建立進度條欄位。
  • JProgressBar.setIndeterminate - 在不確定模式下設定進度條。
  • JProgressBar.setValue - 設定進度條中的進度。

範例

package com.yiibai.swingdemo;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingTester {
       private JFrame mainFrame;
       private JLabel headerLabel;
       private JLabel statusLabel;
       private JPanel controlPanel;

       public SwingTester(){
          prepareGUI();
       }
       public static void main(String[] args){
          SwingTester  swingControlDemo = new SwingTester();      
          swingControlDemo.showProgressBarDemo();
       }
       private void prepareGUI(){
          mainFrame = new JFrame("Swing顯示不確定的進度條");
          mainFrame.setSize(420,420);
          mainFrame.setLayout(new GridLayout(3, 1));

          mainFrame.addWindowListener(new WindowAdapter() {
             public void windowClosing(WindowEvent windowEvent){
                System.exit(0);
             }        
          });    
          headerLabel = new JLabel("", JLabel.CENTER);        
          statusLabel = new JLabel("",JLabel.CENTER);    
          statusLabel.setSize(350,100);

          controlPanel = new JPanel();
          controlPanel.setLayout(new FlowLayout());

          mainFrame.add(headerLabel);
          mainFrame.add(controlPanel);
          mainFrame.add(statusLabel);
          mainFrame.setVisible(true);  
       }
       private JProgressBar progressBar;
       private Task task;
       private JButton startButton;
       private JTextArea outputTextArea;

       private void showProgressBarDemo(){
          headerLabel.setText("Control in action: JProgressBar"); 
          progressBar = new JProgressBar(0, 100);
          progressBar.setIndeterminate(true);
          progressBar.setValue(0);
          progressBar.setStringPainted(true);
          startButton = new JButton("開始~");
          outputTextArea = new JTextArea("",5,20);
          JScrollPane scrollPane = new JScrollPane(outputTextArea);    

          startButton.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
                task = new Task();                
                task.start();
             }
          });
          controlPanel.add(startButton);
          controlPanel.add(progressBar);
          controlPanel.add(scrollPane);
          mainFrame.setVisible(true);  
       }
       private class Task extends Thread {    
          public Task(){
          }
          public void run(){
             for(int i =0; i<= 100; i+=10){
                final int progress = i;

                SwingUtilities.invokeLater(new Runnable() {
                   public void run() {
                      progressBar.setIndeterminate(false);
                      progressBar.setValue(progress);
                      outputTextArea.setText(outputTextArea.getText() 
                         + String.format("已完成 %d%% .\n", progress));
                   }
                });
                try {
                   Thread.sleep(100);
                } catch (InterruptedException e) {}
             }
          }
       }   
    }

執行上面範例程式碼,得到以下結果: