<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 154  文章 - 60  trackbacks - 0
    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    聲明:

    該blog是為了收集資料,認(rèn)識(shí)朋友,學(xué)習(xí)、提高技術(shù),所以本blog的內(nèi)容除非聲明,否則一律為轉(zhuǎn)載!!

    感謝那些公開(kāi)自己技術(shù)成果的高人們!!!

    支持開(kāi)源,尊重他人的勞動(dòng)!!

    常用鏈接

    留言簿(3)

    隨筆分類(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學(xué)習(xí)(技術(shù))

    觀察思考(非技術(shù))

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    Merlin 的魔力: 不確定的進(jìn)度條

    JProgressBar 的一個(gè)細(xì)微但是重要的更新

    級(jí)別: 初級(jí)
    John Zukowski (jaz@zukowski.net), 總裁, JZ Ventures, Inc
    2003 年 12 月 01 日

    開(kāi)發(fā)人員用 JProgressBar 組件向用戶顯示一項(xiàng)任務(wù)的進(jìn)度。針對(duì)非常長(zhǎng)的任務(wù)或者難于精確確定完成進(jìn)度的任務(wù),Merlin版本對(duì) JProgressBar 增加了一個(gè)不確定模式。本月,專欄作者 John Zukowski 對(duì) JProgressBar 的使用作了重新介紹,并討論了它的新的不確定模式。您可以在本文的 討論論壇中與作者以及其他讀者共享您的想法(您也可以單擊文章頂部或者底部的 討論進(jìn)入論壇)。

    在 Java 2 SDK, Standard Edition,版本 1.4 中,有了一些大的變化,如增加了像 JSpinner 這樣的新組件、像 SpringLayout 這樣的新布局管理器、或者像 Java Logging API 這樣的新 API。而另一些變化則沒(méi)有這么顯著,如小的改進(jìn)或者對(duì)現(xiàn)有 API 的優(yōu)化。本月關(guān)于 SpringLayout 組件的技巧就屬于后一種情況。它是細(xì)微的,但是很重要。

    進(jìn)度條的基本用法

    JProgressBar 是原來(lái)的 Swing 組件集中的一個(gè)。它提供了一種以圖形方式顯示進(jìn)程完成進(jìn)度的簡(jiǎn)單方式。當(dāng)進(jìn)程進(jìn)行時(shí),一個(gè)長(zhǎng)條就會(huì)在該組件上逐漸延伸,直到任務(wù)完成并且長(zhǎng)條全部填滿。長(zhǎng)條的移動(dòng)通常是某個(gè)多線程任務(wù)的一部分,這有助于避免阻塞應(yīng)用程序其余部分的進(jìn)度,如常規(guī)的屏幕更新。雖然沒(méi)有哪一條特定的規(guī)則說(shuō)進(jìn)度條必須進(jìn)行線性移動(dòng),但是如果看到進(jìn)程從 10% 移動(dòng)到 35%,然后又回到 27%,然后再增加到 80%,最后以 0% 結(jié)束,作為用戶我會(huì)覺(jué)得多少有些古怪。

    用五個(gè)構(gòu)造函數(shù)中的一個(gè)來(lái)構(gòu)造 JProgressBar ,如清單 1 所示:


    清單 1. JProgressBar 構(gòu)造函數(shù)
      public JProgressBar()
                public JProgressBar(int orientation)
                public JProgressBar(int minimum, int maximum)
                public JProgressBar(int orientation, int minimum, int maximum)
                public JProgressBar(BoundedRangeModel model)
                

    JProgressBar 需要初始化方向和值范圍。方向是通過(guò) JProgressBarVERTICAL 或者 HORIZONTAL 常量確定的。默認(rèn)為 HORIZONTAL

    在創(chuàng)建了這個(gè)組件并在屏幕上顯示它后,啟動(dòng)第二個(gè)線程以執(zhí)行需要測(cè)量其進(jìn)度的任務(wù)。然后定期用 setValue() 方法更新進(jìn)度條的值以顯示任務(wù)的當(dāng)前進(jìn)展。清單 2 顯示了 setValue() 的一個(gè)簡(jiǎn)單例子:


    清單 2. 簡(jiǎn)單的 JProgressBar 使用方法
    import javax.swing.*;
                import java.awt.*;
                import java.awt.event.*;
                import java.lang.reflect.*;
                public class ProgressSample {
                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();
                Runnable runner = new Runnable() {
                public void run() {
                int value = progressBar.getValue();
                progressBar.setValue(value+1);
                }
                };
                for (int i=minimum; i<maximum; i++) {
                try {
                SwingUtilities.invokeAndWait(runner);
                // Our task for each step is to just sleep
                Thread.sleep(DELAY);
                } catch (InterruptedException ignoredException) {
                } catch (InvocationTargetException ignoredException) {
                }
                }
                }
                }
                public static void main(String args[]) {
                // Initialize
                final JProgressBar aJProgressBar = new JProgressBar(0, 100);
                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);
                JFrame theFrame = new JFrame("Progress Bars");
                theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Container contentPane = theFrame.getContentPane();
                contentPane.add(aJProgressBar, BorderLayout.NORTH);
                contentPane.add(aJButton, BorderLayout.SOUTH);
                theFrame.setSize(300, 100);
                theFrame.show();
                }
                }
                

    第一次運(yùn)行這段代碼時(shí),您會(huì)看到類似于圖 1 的屏幕。


    圖 1. 開(kāi)始屏幕
    開(kāi)始屏幕

    單擊這個(gè)按鈕,啟動(dòng)第二個(gè)任務(wù),并在它運(yùn)行時(shí)更新進(jìn)度條。圖 2 顯示了運(yùn)行到一半時(shí)的進(jìn)度條。


    圖 2. 屏幕顯示進(jìn)度
    屏幕顯示進(jìn)度

    這里沒(méi)什么特別的。主要代碼創(chuàng)建帶有一個(gè)按鈕和進(jìn)度條的 GUI。當(dāng)您選擇按鈕時(shí),它就引發(fā)操作以更新進(jìn)度條。進(jìn)度條用來(lái)對(duì)某些任務(wù)進(jìn)行測(cè)量。在示例程序中,這個(gè)任務(wù)就是休眠半秒 100 次。

    在默認(rèn)情況下,除了進(jìn)度條外,沒(méi)有其他關(guān)于進(jìn)度的圖形指示。添加如下的一行代碼,您就可以在任務(wù)完成過(guò)程中,讓進(jìn)度條顯示任務(wù)完成的百分比:

      aJProgressBar.setStringPainted(true);
                

    圖 3 顯示了我們?cè)黾恿诵麓a的屏幕:


    圖 3. 顯示完成百分比
    顯示完成百分比




    回頁(yè)首


    使用不確定模式

    從 Merlin 版本開(kāi)始, JProgressBar 還支持另一種模式 ―― 確定。對(duì)于非固定步數(shù)的長(zhǎng)任務(wù),可以使用這種模式。它顯示固定的動(dòng)畫以表明有些事情正在發(fā)生,但是它不表明完成的百分比。如果您確定了任務(wù)所要花費(fèi)的時(shí)間,就可以切換回確定模式。在不確定模式下, JProgressBar 顯示一個(gè)長(zhǎng)條,在顯示區(qū)域中來(lái)回移動(dòng)。

    清單 3 顯示了這種模式的一個(gè)例子。這個(gè)新方法就是 setIndeterminate() 。值為 true 意味著不確定,而值為 false 則意味著普通或者確定。


    清單 3. 不確定進(jìn)度條
    import javax.swing.*;
                import java.awt.*;
                import java.awt.event.*;
                public class ProgressSample2 {
                public static void main(String args[]) {
                final JProgressBar aJProgressBar = new JProgressBar(0, 100);
                aJProgressBar.setIndeterminate(true);
                JButton aJButton = new JButton("Toggle");
                ActionListener actionListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                boolean indeterminate = aJProgressBar.isIndeterminate();
                aJProgressBar.setIndeterminate(!indeterminate);
                }
                };
                aJButton.addActionListener(actionListener);
                JFrame theFrame = new JFrame("Indeterminate");
                theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Container contentPane = theFrame.getContentPane();
                contentPane.add(aJProgressBar, BorderLayout.NORTH);
                contentPane.add(aJButton, BorderLayout.SOUTH);
                theFrame.setSize(300, 100);
                theFrame.show();
                }
                }
                

    圖 4顯示相關(guān)的屏幕(您需要想像這個(gè)長(zhǎng)條是來(lái)回移動(dòng)的)。按鈕用于在進(jìn)度條的不確定和確定模式之間進(jìn)行切換。


    圖 4. 不確定模式
    不確定模式

    有兩種新的 UI 默認(rèn)值用于改變重繪時(shí)間間隔和循環(huán)時(shí)間: ProgressBar.repaintIntervalProgressBar.cycleTime 。改變這些設(shè)置 ―― 如下所示 ―― 會(huì)改變顯示速度。循環(huán)時(shí)間必須是重繪時(shí)間間隔的偶數(shù)倍,所以如果間隔為 100,那么循環(huán)時(shí)間應(yīng)該是 200、500 或者 1000 ―― 但不能是 750。

      UIManager.put("ProgressBar.repaintInterval", new Integer(150));
                UIManager.put("ProgressBar.cycleTime", new Integer(1050));
                

    注意您需要在創(chuàng)建進(jìn)度條 之前設(shè)置這些值。





    結(jié)束語(yǔ)

    ProgressBar 還有很多內(nèi)容,但是其他特性在 1.4 版中都沒(méi)有改變。我們簡(jiǎn)單回顧了這個(gè)組件的原有使用方式,并介紹了在 Merlin 版本中它的新特性。您也可以考慮用 ProgressMonitor 或者 ProgressMonitorInputStream 監(jiān)視這些長(zhǎng)任務(wù)的進(jìn)度。它們都在內(nèi)部利用了 JProgressBar 的優(yōu)點(diǎn)。



    原文:http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html
    posted on 2007-11-07 09:54 lk 閱讀(448) 評(píng)論(0)  編輯  收藏 所屬分類: j2se
    主站蜘蛛池模板: 亚洲人成人77777网站| 欧美三级在线电影免费| 亚洲Av无码乱码在线观看性色| 99久久免费国产特黄| 最近中文字幕无吗免费高清 | 免费无码专区毛片高潮喷水| 91精品国产免费入口| 亚洲国产精品婷婷久久| 日本免费久久久久久久网站| 亚洲av无码不卡一区二区三区 | 久久亚洲成a人片| 日韩精品免费在线视频| 亚洲国产精品无码成人片久久| 亚洲大片免费观看| 免费看片在线观看| 亚洲国产成人99精品激情在线| 国产精品亚洲精品爽爽| 国产自产拍精品视频免费看| 亚洲人片在线观看天堂无码| 国产精品久久久久影院免费| 一级女性全黄生活片免费看| 亚洲熟妇无码八AV在线播放| 久久精品免费电影| 亚洲人成网站看在线播放| 成年丰满熟妇午夜免费视频| 精品亚洲视频在线| 亚洲一区二区视频在线观看| 丰满人妻一区二区三区免费视频| 免费大片黄在线观看yw| 亚洲AV永久无码精品一福利 | 亚洲精品成人久久久| 大妹子影视剧在线观看全集免费| 2021在线观看视频精品免费| 亚洲欧洲日本精品| 成年女人免费碰碰视频| 免费看一级高潮毛片| 久久青青成人亚洲精品| 最近2019中文字幕mv免费看| 精品一区二区三区无码免费直播| 久久不见久久见中文字幕免费| 久久伊人久久亚洲综合|