【问题标题】:How to use JProgressBar?如何使用 JProgressBar?
【发布时间】:2008-11-10 03:34:25
【问题描述】:

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

【问题讨论】:

标签: java swing


【解决方案1】:

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

【讨论】:

  • 出色的工作扎克!但我想知道它是否会使我的程序变得太慢。似乎我必须处理输入文件两次 - 一次以确定否。单词和另一个时间来处理每个单词。你对此有什么建议吗?比如将所有单词保存在一个数组中或类似的东西中
  • 这取决于瓶颈在哪里......我想读取文件会比计算 soundex 表示并将它们添加到地图要慢。 (续...)
  • (...cont'd) 如果是这样,我不想读取该文件两次。相反,我会将文件长度用作“总数”,将处理的字符数用作“计数”(当然,这只是一个近似值,因为文件长度以字节为单位,而不是字符)。
  • @Zach:然后使用读取的字节数而不是字符数。看到进度条停留在 100(因为你溢出并且绑定的模型不会让你超过 100),或者在任务结束后未能达到 100 是真正的“这不是由专业人士编写的”气味。
  • @Ran:你提出了一个很好的观点!假设每个字符至少用一个字节表示,则可以在进度条到达100%之前完成处理。就像你说的,我们可以计算字节数,但这需要更多的工作(不能只使用简单的 FileReader)。
【解决方案2】:
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多