Как использовать JProgressBar? - PullRequest
       16

Как использовать JProgressBar?

7 голосов
/ 10 ноября 2008

Мне нужно загрузить несколько слов (около 70000) из текстового файла, добавить его в хеш-таблицу (используя soundex в качестве ключа) и отсортировать значения. Делая все это, я хочу показать индикатор с помощью JProgressBar. Такие статьи, как this и this , дают только ненастоящий пример (цикл while). Может кто-нибудь подсказать мне, как мне поступить. Как я могу получить число из условия выше, чтобы установить значение для индикатора выполнения? Также кажется, что есть разные способы сделать это - используя поток, таймер и т. Д. Какой может быть лучший метод для ситуации, такой как выше?

Ответы [ 3 ]

7 голосов
/ 10 ноября 2008

Я бы прочитал текстовый файл в цикле в отдельном рабочем потоке, а не в потоке отправки событий (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()...)
1 голос
/ 20 февраля 2009
0 голосов
/ 19 ноября 2010

Получить размер файла и подсчитать количество байтов, обработанных на каждой итерации. Таким образом, вам не придется дважды просматривать файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...