Мне нужно загрузить набор слов (около 70 000) из текстового файла, добавить его в хеш-таблицу (используя soundex в качестве ключа) и отсортировать значения. Делая все это, я хочу показать индикатор выполнения, используя JProgressBar. Такие статьи, как эта и this дает только нереальный пример (цикл while). Может ли кто-нибудь предложить мне, как мне действовать. Как я могу получить число из приведенного выше условия, чтобы установить значение для индикатора выполнения? Также кажется, что есть разные способы сделать это - с помощью потока, таймера и т. д. Какой метод может быть лучшим для ситуации, такой как выше?
Как использовать JProgressBar?
Ответы (3)
Я бы читал текстовый файл в цикле в выделенном рабочем потоке, а не в потоке отправки событий (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: http://java.sun.com/docs/books/tutorial/uiswing/concurrency/interim.html
Получите размер файла и подсчитайте байты, обработанные на каждой итерации. Таким образом, вам не придется дважды просматривать файл.