2008-11-10 65 views
7

我需要從文本文件中加載一堆單詞(大約70,000),將它添加到散列表(使用soundex作爲鍵)並對值進行排序。在做所有這些時,我想使用JProgressBar顯示進度條。諸如thisthis之類的文章僅給出了一個非實例(一個while循環)。任何人都可以建議我該怎麼做。如何從上述條件獲取數字以設置進度條的值?也似乎有不同的方式來做到這一點 - 使用線程,計時器等。這可能是最好的方法,如上述情況?如何使用JProgressBar?

+0

看看這個[JProgressbar的簡單例子](http://tutorialdata.com/example/swing/JProgressBarExample.html) – 2012-05-11 14:54:42

回答

7

我會在專用工作線程中的循環中讀取文本文件,而不是事件分派線程(EDT)。如果我知道要讀取的單詞總數,則可以計算循環的每次迭代中完成的百分比,並相應地更新進度條。

示例代碼

下面的代碼把不確定模式進度條預處理和後處理,顯示動畫,指示工作正在發生期間。迭代地從輸入文件讀取時使用確定模式。

// INITIALIZATION ON EDT 

// JProgressBar progress = new JProgressBar(); 
// progress.setStringPainted(true); 

// PREPROCESSING 

// update progress bar (indeterminate mode) 
SwingUtilities.invokeLater(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     progress.setIndeterminate(true); 
     progress.setString("Preprocessing..."); 
    } 
}); 

// perform preprocessing (open input file, determine total number of words, etc) 

// PROCESSING 

// update progress bar (switch to determinate mode) 
SwingUtilities.invokeLater(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     progress.setIndeterminate(false); 
    } 
}); 

int count = 0; 

while (true) 
{ 
    // read a word from the input file; exit loop if EOF 

    // compute soundex representation 

    // add entry to map (hash table) 

    // compute percentage completed 
    count++; 
    final int percent = count * 100/total; 

    // update progress bar on the EDT 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      progress.setString("Processing " + percent + "%"); 
      progress.setValue(percent); 
     } 
    }); 
} 

// POSTPROCESSING 

// update progress bar (switch to indeterminate mode) 
SwingUtilities.invokeLater(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     progress.setIndeterminate(true); 
     progress.setString("Postprocessing..."); 
    } 
}); 

// perform postprocessing (close input file, etc) 

// DONE! 

SwingUtilities.invokeLater(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     progress.setIndeterminate(false); 
     progress.setString("Done!"); 
     progress.setValue(100); 
    } 
}); 

建議

  • 考慮編寫一個方便的方法以更新EDT進度條,以減少代碼(SwingUtilities.invokeLater... public void run()...
+0

優秀的工作扎克!但我想知道它是否會讓我的編程方式變得太慢。似乎我必須處理輸入文件兩次 - 以確定否。的文字和另一次處理每個單詞。你有什麼建議嗎?像舉行一個數組或類似的東西 – javac 2008-11-10 05:27:59

0

獲取文件大小並計算字節數在每次迭代中都進行了處理。這樣,您不必循環兩次文件。