Я бы прочитал текстовый файл в цикле в отдельном рабочем потоке, а не в потоке отправки событий (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()...
)