Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Индикаторы выполнения
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Индикаторы выполнения

Иногда задача, работающая в пределах программы, могла бы требовать времени к полному. Удобная для пользователя программа обеспечивает некоторую индикацию пользователю, что задача происходит, сколько времени задача могла бы взять, и сколько работы было уже сделано. Один способ указать на работу, и возможно количество продвижения, состоит в том, чтобы использовать изображение с анимацией.

Другой способ указать на работу состоит в том, чтобы установить ожидать курсор, используя Cursor class и Component- определенный setCursor метод. Например, следующий код заставляет ожидать курсор быть выведенным на экран, когда курсор закончен container (включая любые компоненты это содержит, у которых нет никакого определенного курсора):

container.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

Чтобы передать, насколько полный задача, можно использовать индикатор выполнения как этот:

Типичный индикатор выполнения

Иногда невозможно сразу определить длину продолжительной задачи, или задача могла бы остаться упорно продолженной то же самое состояние завершения в течение долгого времени. Можно показать работу без измеримого продвижения, помещая индикатор выполнения в неопределенный режим. Индикатор выполнения в неопределенном режиме выводит на экран анимацию, чтобы указать, что работа происходит. Как только индикатор выполнения может вывести на экран больше значимой информации, следует переключить это назад в ее значение по умолчанию, определенный режим. В стили Java неопределенные индикаторы выполнения похожи на это:

Неопределенный индикатор выполнения

Swing обеспечивает три класса, чтобы помочь Вам использовать индикаторы выполнения:

JProgressBar
Видимый компонент, чтобы графически вывести на экран, сколько из полной задачи завершилось. См. Используя Определенные Индикаторы выполнения для информации и примера использования типичного индикатора выполнения. Раздел Используя Неопределенный Режим говорит Вам, как анимировать индикатор выполнения, чтобы показать действие прежде, чем контекст задачи будет известен.
ProgressMonitor
Не видимый компонент. Вместо этого экземпляр этого class контролирует продвижение задачи и раскрывается диалоговое окно в случае необходимости. См., Как Использовать Мониторы Продвижения для деталей и примера использования монитора продвижения.
ProgressMonitorInputStream
Входной поток с присоединенным монитором продвижения, который контролирует чтение из потока. Вы используете экземпляр этого потока как любой из других входных потоков, описанных в Основном вводе-выводе. Можно получить монитор продвижения потока со звонком getProgressMonitor и сконфигурируйте это как описано в том, Как Использовать Мониторы Продвижения.

После того, как Вы видите, что индикатор выполнения и продвижение контролируют в действии, Решая, использовать Ли Индикатор выполнения, или Монитор Продвижения может помочь Вам выяснить, который является подходящим для Вашего приложения.

Используя Определенные Индикаторы выполнения

Вот изображение маленького демонстрационного приложения, которое использует индикатор выполнения, чтобы измерить продвижение задачи, которая работает в ее собственном потоке:

Снимок ProgressBarDemo, который использует индикатор выполнения

Попробуйте это: 

Ниже код от ProgressBarDemo.java это создает и устанавливает индикатор выполнения:

//Where member variables are declared:
JProgressBar progressBar;
...
//Where the GUI is constructed:
progressBar = new JProgressBar(0, task.getLengthOfTask());
progressBar.setValue(0);
progressBar.setStringPainted(true);

Конструктор, который создает индикатор выполнения, устанавливает минимальные и максимальные значения индикатора выполнения. Можно также установить эти значения с setMinimum и setMaximum. Минимальные и максимальные значения, используемые в этой программе, 0 и длина задачи, которая типична для многих программ и задач. Однако, минимальные и максимальные значения индикатора выполнения могут быть любым значением, даже отрицательным. Фрагмент кода также устанавливает текущую стоимость индикатора выполнения в 0.

Звонок setStringPainted заставляет индикатор выполнения выводить на экран, в пределах его границ, текстовой индикации относительно процента задачи, которая завершилась. По умолчанию индикатор выполнения выводит на экран значение, возвращенное getPercentComplete метод, отформатированный как процент, такой как 33 %. Альтернативно, можно заменить значение по умолчанию различной строкой, вызывая setString. Например,

if (/*...half way done...*/)
    progressBar.setString("Half way there!");

Когда пользовательские щелчки Запускаются, экземпляр внутреннего class Task создается и выполняется.

public void actionPerformed(ActionEvent evt) {
    startButton.setEnabled(false);
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    done = false;
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();
}

Task подкласс javax.swing.SwingWorker. Task экземпляр делает три важных вещи для ProgressBarDemo:

  1. Экземпляр вызывает doInBackground в отдельном потоке. Это - то, где продолжительная задача фактически выполняется. Используя фоновый поток вместо диспетчеризирующего событие потока препятствует тому, чтобы пользовательский интерфейс заморозился, в то время как задача работает.
  2. Когда фоновая задача полна, экземпляр вызывает done метод в диспетчеризирующем событие потоке.
  3. Экземпляр поддерживает связанное свойство, progress, это обновляется, чтобы указать на продвижение задачи. propertyChange метод вызывается каждый раз progress изменения.

См. Рабочие потоки и SwingWorker в Параллелизме в Swing для получения дополнительной информации о SwingWorker.

Фоновая задача в ProgressBarDemo моделирует реальную задачу, сообщая о случайном количестве продвижения наугад интервалы. propertyChange метод отвечает на изменения в задача progress свойство, обновляя индикатор выполнения:

public void propertyChange(PropertyChangeEvent evt) {
    if (!done) {
        int progress = task.getProgress();
        progressBar.setValue(progress);
        taskOutput.append(String.format(
                "Completed %d%% of task.\n", progress));
    }

Когда фоновая задача полна, задача done метод сбрасывает индикатор выполнения:

public void done() {
    //Tell progress listener to stop updating progress bar.
    done = true;
    Toolkit.getDefaultToolkit().beep();
    startButton.setEnabled(true);
    setCursor(null); //turn off the wait cursor
    progressBar.setValue(progressBar.getMinimum());
    taskOutput.append("Done!\n");
}

Отметьте что done метод устанавливает done поле к true, предотвращение propertyChange от создания дальнейших обновлений к индикатору выполнения. Это необходимо, потому что финал обновляет к progress свойство может occcur после done вызывается.

Используя Неопределенный Режим

В ProgressBarDemo2 неопределенный режим устанавливается, пока фактическое продвижение не начинается:

public void propertyChange(PropertyChangeEvent evt) {
    if (!done) {
        int progress = task.getProgress();
        if (progress == 0) {
            progressBar.setIndeterminate(true);
            taskOutput.append("No progress yet\n");
        } else {
            progressBar.setIndeterminate(false); 
            progressBar.setString(null);
            progressBar.setValue(progress);
            taskOutput.append(String.format(
                    "Completed %d%% of task.\n", progress));
        }
    }
}

Другие изменения в коде связываются, чтобы представить дисплей в виде строки. Индикатор выполнения, который выводит на экран строку, вероятно, будет более высоким чем тот, который не делает, и, как демонстрационные разработчики, у нас есть arbitarily, решенный, что этот индикатор выполнения должен вывести на экран строку только, когда это находится в значении по умолчанию, определенном режиме. Однако, мы хотим избежать уродства расположения, которое могло бы закончиться, если индикатор выполнения измененный height, когда это изменило режимы. Таким образом, листы кода в звонке setStringPainted(true) но добавляет звонок setString("") так, чтобы никакой текст не был выведен на экран. Позже, когда индикатор выполнения переключается от неопределенного до определенного режима, вызывая setString(null) заставляет индикатор выполнения вывести на экран свою строку значения по умолчанию.

Одно изменение, которое мы не производили, удаляло звонок progressBar.setValue от progress обработчик событий. Вызов не делает ничего плохого, потому что неопределенный индикатор выполнения не использует свое свойство значения, кроме, возможно, чтобы вывести на экран его в строке состояния. Фактически, хранение данных индикатора выполнения, настолько актуальных насколько возможно, является хорошей практикой, так как некоторый взгляд и чувства не могли бы поддерживать неопределенный режим.


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, Демонстрационный пример ProgressBar2, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Демонстрационный пример ProgressBar2
  2. Нажмите кнопку Start. Отметьте, что индикатор выполнения начинает анимировать, как только кнопка нажимается, и затем переключается назад в определенный режим (как ProgressBarDemo).

Как Использовать Мониторы Продвижения

Теперь давайте перепишем ProgressBarDemo, чтобы использовать монитор продвижения вместо индикатора выполнения. Вот изображение новой демонстрационной программы, ProgressMonitorDemo:

Снимок ProgressMonitorDemo и диалогового окна переводится в рабочее состояние монитором продвижения

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, Демонстрационный пример ProgressMonitor, использующий Сеть Java™, Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример Демонстрационного примера ProgressMonitor
  2. Нажмите кнопку Start. После определенного количества времени программа выводит на экран диалоговое окно продвижения.
  3. Щелкните по кнопке OK. Отметьте, что задача продолжается даже при том, что диалогового окна не стало.
  4. Запустите другую задачу. После того, как диалоговое окно раскрывается, нажмите кнопку Cancel. Диалоговое окно уходит и остановки задачи.

Монитор продвижения не может использоваться снова, таким образом, новый должен быть создан каждый раз запускается, когда новая задача. Эта программа создает монитор продвижения каждый раз, когда пользователь запускает новую задачу с кнопки Start.

Вот оператор, который создает монитор продвижения:

progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this,
                                      "Running a Long Task",
                                      "", 0, task.getLengthOfTask());

Этот код использование ProgressMonitor's только конструктор, чтобы создать монитор и инициализировать несколько параметров:

По умолчанию монитор продвижения ожидает minium 500 миллисекунд прежде, чем решить, раскрыться ли диалоговое окно. Это также ожидает продвижения, чтобы стать больше чем минимальное значение. Если это вычисляет, что задача возьмет больше чем 2000 миллисекунд, чтобы завершиться, диалоговое окно продвижения появляется. Чтобы скорректировать минимальное время ожидания, вызвать setMillisToDecidedToPopup. Чтобы скорректировать минимальное время продвижения, требуемое для диалогового окна появиться, вызвать setMillisToPopup.

Очевидным фактом, что этот пример использует монитор продвижения, он добавляет опцию, которая не присутствовала в версии программы, которая использует индикатор выполнения: пользователь может отменить задачу, нажимая кнопку Cancel на диалоговом окне. Вот код в примере, который проверяет, чтобы видеть если пользователь, отмененный задача или если задача, из которой выходят обычно:

if (progressMonitor.isCanceled() || task.isDone()) {
    progressMonitor.close();
    Toolkit.getDefaultToolkit().beep();
    if (progressMonitor.isCanceled()) {
        task.cancel(true);
        taskOutput.append("Task canceled.\n");
    } else {
        taskOutput.append("Task completed.\n");
    }
    startButton.setEnabled(true);
}

Отметьте, что монитор продвижения самостоятельно не отменяет задачу. Это обеспечивает GUI и API, чтобы позволить программе делать так легко.

Решение, использовать Ли Индикатор выполнения или Монитор Продвижения

Используйте индикатор выполнения если:

Используйте монитор продвижения если:

Если Вы решаете использовать монитор продвижения и задачу, Вы контролируете, читает из входного потока, используйте ProgressMonitorInputStream class.

Контрольный API Продвижения

Следующие таблицы приводят обычно используемый API для того, чтобы использовать мониторы продвижения и индикаторы выполнения. Поскольку JProgressBar подкласс JComponent, другие методы Вы, вероятно, обратитесь к a JProgressBar перечисляются в Классе JComponent. Отметьте это ProgressMonitor подкласс Object и не визуальный компонент.

API для того, чтобы контролировать продвижение попадает в эти категории:

Создание Индикатора выполнения
Конструктор Цель
JProgressBar ()
JProgressBar (интервал, интервал)
Создайте горизонтальный индикатор выполнения. Конструктор без параметров инициализирует индикатор выполнения с минимальным и начальным значением 0 и максимумом 100. Конструктор с двумя целочисленными параметрами определяет минимальные и максимальные значения.
JProgressBar (интервал)
JProgressBar (интервал, интервал, интервал)
Создайте индикатор выполнения с указанной ориентацией, которая может быть также JProgressBar.HORIZONTAL или JProgressBar.VERTICAL. Дополнительные вторые и третьи параметры определяют минимальные и максимальные значения.
JProgressBar (BoundedRangeModel) Создайте горизонтальный индикатор выполнения с указанной моделью диапазона.
Установка или Получение Ограничений/Значений Индикатора выполнения
Метод Цель
освободите setValue (интервал)
интервал getValue ()
Набор или получает текущую стоимость индикатора выполнения. Значение ограничивается минимальными и максимальными значениями.
удвойте getPercentComplete () Получите процент, полный для индикатора выполнения.
освободите setMinimum (интервал)
интервал getMinimum ()
Набор или получает минимальное значение индикатора выполнения.
освободите setMaximum (интервал)
интервал getMaximum ()
Набор или получает максимальное значение индикатора выполнения.
освободите setModel (BoundedRangeModel)
BoundedRangeModel getModel ()
Набор или использовал модель индикатором выполнения. Модель устанавливает ограничения индикатора выполнения и значения, таким образом, можно использовать ее непосредственно, поскольку альтернатива использованию человека устанавливала/получала упомянутые выше методы.
Управление Появлением Индикатора выполнения
Метод Цель
освободите (булев) setIndeterminate Определяя true, поместите индикатор выполнения в неопределенный режим. Определение false откладывает индикатор выполнения в его значение по умолчанию, определенный режим.
освободите setOrientation (интервал)
интервал getOrientation ()
Набор или добирается, является ли индикатор выполнения вертикалью или горизонталью. Приемлемые значения JProgressBar.VERTICAL или JProgressBar.HORIZONTAL.
освободите (булев) setBorderPainted
булев isBorderPainted ()
Набор или добирается, есть ли у индикатора выполнения граница.
освободите (булев) setStringPainted
булев isStringPainted ()
Набор или добирается, выводит ли индикатор выполнения на экран строку процента. По умолчанию значение строки процента является значением, возвращенным getPercentComplete отформатированный как процент. Можно установить строку, которая будет выведена на экран с setString.
освободите setString (Строка)
Представьте getString в виде строки ()
Набор или получает строку процента.
Создание Монитора Продвижения
Метод или Конструктор Цель
ProgressMonitor (Компонент, Объект, Строка, интервал, интервал) Создайте монитор продвижения. Component параметром является родитель для диалогового окна монитора. Object параметром является сообщение, чтобы поставить область опции в пределах диалогового окна. Значение этого объекта обычно a String. String параметром является изменчивое примечание состояния. Заключительные два int набор параметров минимальные и максимальные значения, соответственно, для индикатора выполнения используется в диалоговом окне.
ProgressMonitor getProgressMonitor ()
ProgressMonitorInputStream)
Получает монитор продвижения, который контролирует чтение из входного потока.
Конфигурирование Монитора Продвижения
Метод Цель
освободите setMinimum (интервал)
интервал getMinimum ()
Набор или получает минимальное значение монитора продвижения. Это значение используется монитором, чтобы установить индикатор выполнения в диалоговом окне.
освободите setMaximum (интервал)
интервал getMaximum ()
Набор или получает максимальное значение монитора продвижения. Это значение используется монитором, чтобы установить индикатор выполнения в диалоговом окне.
освободите setProgress (интервал) Обновите продвижение монитора.
void setNote(String)
String getNote()
Набор или получает примечание состояния. Это примечание выводится на экран на диалоговом окне. Чтобы опустить примечание состояния от диалогового окна, обеспечить null как третий параметр конструктору монитора.
void setMillisToDecideToPopup(int)
int getMillisToDecideToPopup()
Набор или получает время, после которого монитор должен решить ли к раскрывающемуся диалоговое окно.
Завершение Монитора Продвижения
Метод Цель
void close() Закройте монитор продвижения. Это избавляется от диалогового окна.
boolean isCanceled() Определите ли пользователь, нажатый кнопка Cancel.

Примеры то Продвижение Монитора

Этот после использования в качестве примера JProgressBar или ProgressMonitor.

Пример Где Описано Примечания
ProgressBarDemo Этот раздел Использует основной индикатор выполнения, чтобы показать продвижение на задаче, работающей в отдельном потоке.
ProgressBarDemo2 Этот раздел Использует основной индикатор выполнения, чтобы показать продвижение на задаче, работающей в отдельном потоке.
ProgressMonitorDemo Этот раздел Модификация предыдущего примера, который использует монитор продвижения вместо индикатора выполнения.

Если Вы программируете в JavaFX, см. Индикатор выполнения и Индикатор хода выполнения.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Поля Пароля
Следующая страница: Как Использовать Корневые Области