C語言中文網 目錄
首頁 > Java Swing 閱讀:927

Java Swing JProgressBar:進度條組件

< 上一頁Swing滑塊 Swing計時器下一頁 >

進度條(JProgressBar)是一種以可視化形式顯示某些任務進度的組件。JProgressBar 類實現了一個用于為長時間的操作提供可視化指示器的 GUI 進度條。在任務的完成進度中,進度條顯示該任務完成的百分比。此百分比通常由一個矩形以可視化形式表示,該矩形開始是空的,隨著任務的完成逐漸被填充。此外,進度條可顯示此百分比的文本表示形式。

JProgressBar 類的常用構造方法和 JSlider 類的常用構造方法一樣,這里不再重復。如下示例代碼演示了如何創建一個 JProgressBar 類實例。
//創建一個最小值是0,最大值是100的進度條
JProgressBar pgbar=new JProgressBar(0,100);
//創建一個最小值是0,最大值是60,當前值是20的進度條
JProgressBar pgbar=new JProgressBar(0,60,20);

JProgressBar 類的常用方法如表 1 所示。

表1 JProqressBar類的常用方法
方法名稱 說明
getMaximum() 返回進度條的最大值
getMinimum() 返回進度條的最小值
getPercentComplete() 返回進度條的完成百分比
getString() 返回當前進度的 String 表示形式
getValue() 返回進度條的當前 value
setBorderPainted(boolean b) 設置 borderPainted 屬性,如果進度條應該繪制其邊框,則此屬性為 true
setIndeterminate(boolean
newValue)
設置進度條的 indeterminate 屬性,該屬性確定進度條處于確定模式中還
是處于不確定模式中
setMaximum(int n) 將進度條的最大值設置為 n
setMinimum(int n) 將進度條的最小值設置為 n
setOrientation(int newOrientation) 將進度條的方向設置為 newOrientation
setString(String s) 設置進度字符串的值
setStringPainted(boolean b) 設置 stringPainted 屬性的值,該屬性確定進度條是否應該呈現進度字符串
setValue(int n) 將進度條的當前值設置為 n
updateUI() 將 UI 屬性重置為當前外觀對應的值

其中,setOrientation() 方法的參數值必須為 SwingConstants.VERTICAL 或 SwingConstants.HORIZONTAL。JProgressBar 使用 BoundedRangeModel 作為其數據模型,以 value 屬性表示該任務的“當前”狀態,minimum 和 maximum 屬性分別表示開始點和結束點。

技巧:如果要執行一個未知長度的任務,可以調用 setlndeterminate(true) 將進度條設置為不確定模式。不確定模式的進度條將持續地顯示動畫來表示正進行的操作。一旦可以確定任務長度和進度量,則應該更新進度條的值,將其切換到確定模式。

例 1

使用 JProgressBar 類創建一個進度條模擬程序升級過程,實現過程如下。

(1) 創建一個繼承自 JFrame 的 JProgressBarDemo 類。

(2) 在構造方法中添加一個空的進度條,然后設置它的顯示屬性。主要代碼如下:
package ch18;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
public class JProgressBarDemo extends JFrame
{
    //static JProgressBarDemo frame;
    public JProgressBarDemo()
    {
        setTitle("使用進度條");
        JLabel label=new JLabel("歡迎使用在線升級功能!");
        //創建一個進度條
        JProgressBar progressBar=new JProgressBar();
        JButton button=new JButton("完成");
        button.setEnabled(false);
        Container container=getContentPane();
        container.setLayout(new GridLayout(3,1));
        JPanel panel1=new JPanel(new FlowLayout(FlowLayout.LEFT));
        JPanel panel2=new JPanel(new FlowLayout(FlowLayout.CENTER));
        JPanel panel3=new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panel1.add(label);    //添加標簽
        panel2.add(progressBar);    //添加進度條
        panel3.add(button);    //添加按鈕
        container.add(panel1);
        container.add(panel2);
        container.add(panel3);
        progressBar.setStringPainted(true);
        //如果不需要進度上顯示“升級進行中...”,可注釋此行
        progressBar.setString("升級進行中...");
        //如果需要使用不確定模式,可使用此行
        //progressBar.setIndeterminate(true);
        //開啟一個線程處理進度
        new Progress(progressBar, button).start();
        //單機“完成”按鈕結束程序
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                dispose();
                System.exit(0);
            }
        });
    }
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        JProgressBarDemo frame=new JProgressBarDemo();
        //frame.setBounds(300,200,300,150);    //設置容器的大小
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
    }
}

(3) 創建 Progress 線程并實現對進度條進度的控制,實現代碼如下。
private class Progress extends Thread
{
    JProgressBar progressBar;
    JButton button;
    //進度條上的數字
    int[] progressValues={6,18,27,39,51,66,81,100};
    Progress(JProgressBar progressBar,JButton button)
    {
        this.progressBar=progressBar;
        this.button=button;
    }
    public void run()
    {
        for(int i=0;i<progressValues.length;i++)
        {
            try
            {
                Thread.sleep(3000);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
            //設置進度條的值
            progressBar.setValue(progressValues[i]);
        }
        progressBar.setIndeterminate(false);
        progressBar.setString("升級完成!");
        button.setEnabled(true);
    }
}

上述代碼定義了一個進度條的進度數組 progressValues。線程每隔 1000 毫秒從數組中取一個數字作為當前進度,并使用 JProgressBar 類的 setValue() 方法更新到進度條。最后使進度條顯示“升級完成!”字符串,并使“完成”按鈕可用。

圖 1 為程序的運行效果。圖 2 為調用 Setlndeterminate(true) 方法后進度條使用不確定模式的運行效果。圖 3 為默認的數字進度條運行效果。

進度條運行效果     進度條運行效果
圖1 進度條運行效果

不確定模式下進度條的運行效果
圖2 不確定模式進度條效果

數字模式下進度條的運行效果
圖3 數字進度條運行效果
< 上一頁Swing滑塊 Swing計時器下一頁 >

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo