如何使用JProgressBar?

时间:2008-11-10 03:34:26

标签: java swing

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

3 个答案:

答案 0 :(得分: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()...

答案 1 :(得分:1)

答案 2 :(得分:0)

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