简体   繁体   English

如何使用JProgressBar?

[英]How to use JProgressBar?

I need to load a bunch of words (about 70,000) from a text file, add it to a hashtable (using soundex as a key) and sort the values. 我需要从文本文件中加载一堆单词(大约70,000),将其添加到哈希表(使用soundex作为键)并对值进行排序。 While doing all these I want to show a progress bar using JProgressBar. 在做所有这些时,我想使用JProgressBar显示进度条。 Articles such as this and this , only gives a non-real example (a while loop). 文章如这个这个 ,只给出了一个非真实的例子(while循环)。 Can anyone suggest me how should I proceed. 任何人都可以建议我如何进行。 How can I get a number from above condition to set the value for the progress bar? 如何从上述条件中获取数字以设置进度条的值? Also it seems that there are different ways to do it - using thread, timer etc. Which could be the best method for the situation such as above? 此外,似乎有不同的方法来做 - 使用线程,计时器等。这可能是上述情况的最佳方法?

I would read the text file in a loop on a dedicated work thread, not the event-dispatch thread (EDT). 我会在专用工作线程的循环中读取文本文件,而不是事件派发线程(EDT)。 If I know the total number of words to be read, then I can compute the percentage completed at each iteration of the loop and update the progress bar accordingly. 如果我知道要读取的单词总数,那么我可以计算循环的每次迭代完成的百分比并相应地更新进度条。

Sample Code 示例代码

The following code puts the progress bar in indeterminate mode during preprocessing and postprocessing, displaying an animation that indicates work is occurring. 以下代码在预处理和后处理期间将进度条置于不确定模式,显示指示正在进行工作的动画。 Determinate mode is used when reading iteratively from the input file. 从输入文件迭代读取时使用确定模式。

// 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);
    }
});

Suggestions 建议

  • Consider writing a convenience method to update the progress bar on the EDT, so as to reduce clutter in your code ( SwingUtilities.invokeLater... public void run()... ) 考虑编写一个方便的方法来更新EDT上的进度条,以减少代码中的混乱( SwingUtilities.invokeLater... public void run()...

Get the file size and count the bytes processed on each iteration. 获取文件大小并计算每次迭代处理的字节数。 That way, you don't have to cycle through the file twice. 这样,您不必循环两次文件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM