Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JProgressBar?_Java_Swing - Fatal编程技术网

Java 如何使用JProgressBar?

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

我需要从文本文件中加载一堆单词(大约70000个),将其添加到哈希表(使用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:

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

干得好,扎克!但我不知道这是否会使我的程序速度太慢。似乎我必须对输入文件进行两次处理——一次确定字数,另一次处理每个字。你对此有什么建议吗?比如把所有的单词放在一个数组中或者类似的东西,这取决于瓶颈在哪里。。。我想读取文件要比计算soundex表示并将其添加到地图中慢。如果是这样,我就不想把文件读两遍了。相反,我会使用文件长度作为“总数”,处理的字符数作为“计数”(当然,这只是一个近似值,因为文件长度是以字节而不是字符表示的)。@Zach:然后使用读取的字节数而不是字符数。看到进度条停留在100上(因为您溢出,绑定模型不会让您超过100),或者任务结束后无法达到100,这真的是一种“这不是专业人士写的”味道。@Ran:你提出了一个很好的观点!假设每个字符至少由一个字节表示,处理可能在进度条达到100%之前完成。正如您所说,我们可以计算字节数,但这需要更多的工作(不能只使用简单的文件读取器)