如何使用JProgressBar?

我需要从文本文件中加载一堆单词(大约70,000),将其添加到哈希表(使用soundex作为键)并对值进行排序。 在做所有这些时,我想使用JProgressBar显示进度条。 诸如此类和此类的文章仅给出了一个非实际的例子(while循环)。 任何人都可以建议我如何进行。 如何从上述条件中获取数字以设置进度条的值? 此外,似乎有不同的方法来做 – 使用线程,计时器等。这可能是上述情况的最佳方法?

我会在专用工作线程的循环中读取文本文件,而不是事件派发线程(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()...

使用SwingWorker: http : //java.sun.com/docs/books/tutorial/uiswing/concurrency/interim.html

获取文件大小并计算每次迭代处理的字节数。 这样,您不必循环文件两次。