Spec-Zone .ru
спецификации, руководства, описания, API
|
Иногда задача, работающая в пределах программы, могла бы требовать времени к полному. Удобная для пользователя программа обеспечивает некоторую индикацию пользователю, что задача происходит, сколько времени задача могла бы взять, и сколько работы было уже сделано. Один способ указать на работу, и возможно количество продвижения, состоит в том, чтобы использовать изображение с анимацией.
Другой способ указать на работу состоит в том, чтобы установить ожидать курсор, используя Cursor
class и Component
- определенный setCursor
container
(включая любые компоненты это содержит, у которых нет никакого определенного курсора):
container.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
Чтобы передать, насколько полный задача, можно использовать индикатор выполнения как этот:
Иногда невозможно сразу определить длину продолжительной задачи, или задача могла бы остаться упорно продолженной то же самое состояние завершения в течение долгого времени. Можно показать работу без измеримого продвижения, помещая индикатор выполнения в неопределенный режим. Индикатор выполнения в неопределенном режиме выводит на экран анимацию, чтобы указать, что работа происходит. Как только индикатор выполнения может вывести на экран больше значимой информации, следует переключить это назад в ее значение по умолчанию, определенный режим. В стили Java неопределенные индикаторы выполнения похожи на это:
Swing обеспечивает три класса, чтобы помочь Вам использовать индикаторы выполнения:
JProgressBar
ProgressMonitor
ProgressMonitorInputStream
getProgressMonitor
и сконфигурируйте это как описано в том, Как Использовать Мониторы Продвижения.После того, как Вы видите, что индикатор выполнения и продвижение контролируют в действии, Решая, использовать Ли Индикатор выполнения, или Монитор Продвижения может помочь Вам выяснить, который является подходящим для Вашего приложения.
Вот изображение маленького демонстрационного приложения, которое использует индикатор выполнения, чтобы измерить продвижение задачи, которая работает в ее собственном потоке:
Ниже код от 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
:
doInBackground
в отдельном потоке. Это - то, где продолжительная задача фактически выполняется. Используя фоновый поток вместо диспетчеризирующего событие потока препятствует тому, чтобы пользовательский интерфейс заморозился, в то время как задача работает.done
метод в диспетчеризирующем событие потоке.progress
, это обновляется, чтобы указать на продвижение задачи. propertyChange
метод вызывается каждый раз progress
изменения.См. 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
обработчик событий. Вызов не делает ничего плохого, потому что неопределенный индикатор выполнения не использует свое свойство значения, кроме, возможно, чтобы вывести на экран его в строке состояния. Фактически, хранение данных индикатора выполнения, настолько актуальных насколько возможно, является хорошей практикой, так как некоторый взгляд и чувства не могли бы поддерживать неопределенный режим.
Теперь давайте перепишем ProgressBarDemo, чтобы использовать монитор продвижения вместо индикатора выполнения. Вот изображение новой демонстрационной программы, ProgressMonitorDemo:
Монитор продвижения не может использоваться снова, таким образом, новый должен быть создан каждый раз запускается, когда новая задача. Эта программа создает монитор продвижения каждый раз, когда пользователь запускает новую задачу с кнопки Start.
Вот оператор, который создает монитор продвижения:
progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this, "Running a Long Task", "", 0, task.getLengthOfTask());
Этот код использование ProgressMonitor
's только конструктор, чтобы создать монитор и инициализировать несколько параметров:
null
для этого параметра примечание опускается от диалогового окна. Пример обновляет примечание каждый раз progress
изменения свойства. Это обновляет текущую стоимость монитора одновременно: int progress = task.getProgress(); String message = String.format("Completed %d%%.\n", progress); progressMonitor.setNote(message); progressMonitor.setProgress(progress); taskOutput.append(message);
По умолчанию монитор продвижения ожидает 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, чтобы позволить программе делать так легко.
Используйте индикатор выполнения если:
Используйте монитор продвижения если:
isCanceled
метод, чтобы узнать, если пользователя, нажатого кнопка Cancel.setNote
метод так, чтобы задача могла обеспечить дополнительную информацию о том, что это делает. Например, задача установки могла бы сообщить об имени каждого файла, поскольку это устанавливается.Если Вы решаете использовать монитор продвижения и задачу, Вы контролируете, читает из входного потока, используйте ProgressMonitorInputStream
Следующие таблицы приводят обычно используемый API для того, чтобы использовать мониторы продвижения и индикаторы выполнения. Поскольку JProgressBar
подкласс JComponent
, другие методы Вы, вероятно, обратитесь к a JProgressBar
перечисляются в Классе JComponent. Отметьте это ProgressMonitor
подкласс Object
и не визуальный компонент.
API для того, чтобы контролировать продвижение попадает в эти категории:
Конструктор | Цель |
---|---|
|
Создайте горизонтальный индикатор выполнения. Конструктор без параметров инициализирует индикатор выполнения с минимальным и начальным значением 0 и максимумом 100. Конструктор с двумя целочисленными параметрами определяет минимальные и максимальные значения. |
|
Создайте индикатор выполнения с указанной ориентацией, которая может быть также JProgressBar.HORIZONTAL или JProgressBar.VERTICAL . Дополнительные вторые и третьи параметры определяют минимальные и максимальные значения. |
|
Создайте горизонтальный индикатор выполнения с указанной моделью диапазона. |
Метод | Цель |
---|---|
|
Набор или получает текущую стоимость индикатора выполнения. Значение ограничивается минимальными и максимальными значениями. |
|
Получите процент, полный для индикатора выполнения. |
|
Набор или получает минимальное значение индикатора выполнения. |
|
Набор или получает максимальное значение индикатора выполнения. |
|
Набор или использовал модель индикатором выполнения. Модель устанавливает ограничения индикатора выполнения и значения, таким образом, можно использовать ее непосредственно, поскольку альтернатива использованию человека устанавливала/получала упомянутые выше методы. |
Метод | Цель |
---|---|
|
Определяя true , поместите индикатор выполнения в неопределенный режим. Определение false откладывает индикатор выполнения в его значение по умолчанию, определенный режим. |
|
Набор или добирается, является ли индикатор выполнения вертикалью или горизонталью. Приемлемые значения JProgressBar.VERTICAL или JProgressBar.HORIZONTAL . |
|
Набор или добирается, есть ли у индикатора выполнения граница. |
|
Набор или добирается, выводит ли индикатор выполнения на экран строку процента. По умолчанию значение строки процента является значением, возвращенным getPercentComplete отформатированный как процент. Можно установить строку, которая будет выведена на экран с setString . |
|
Набор или получает строку процента. |
Метод или Конструктор | Цель |
---|---|
|
Создайте монитор продвижения. Component параметром является родитель для диалогового окна монитора. Object параметром является сообщение, чтобы поставить область опции в пределах диалогового окна. Значение этого объекта обычно a String . String параметром является изменчивое примечание состояния. Заключительные два int набор параметров минимальные и максимальные значения, соответственно, для индикатора выполнения используется в диалоговом окне. |
(в ProgressMonitorInputStream ) |
Получает монитор продвижения, который контролирует чтение из входного потока. |
Метод | Цель |
---|---|
|
Набор или получает минимальное значение монитора продвижения. Это значение используется монитором, чтобы установить индикатор выполнения в диалоговом окне. |
|
Набор или получает максимальное значение монитора продвижения. Это значение используется монитором, чтобы установить индикатор выполнения в диалоговом окне. |
|
Обновите продвижение монитора. |
void setNote(String) String getNote() |
Набор или получает примечание состояния. Это примечание выводится на экран на диалоговом окне. Чтобы опустить примечание состояния от диалогового окна, обеспечить null как третий параметр конструктору монитора. |
void setMillisToDecideToPopup(int) int getMillisToDecideToPopup() |
Набор или получает время, после которого монитор должен решить ли к раскрывающемуся диалоговое окно. |
Метод | Цель |
---|---|
void close() |
Закройте монитор продвижения. Это избавляется от диалогового окна. |
boolean isCanceled() |
Определите ли пользователь, нажатый кнопка Cancel. |
Этот после использования в качестве примера JProgressBar
или ProgressMonitor
.
Пример | Где Описано | Примечания |
---|---|---|
ProgressBarDemo |
Этот раздел | Использует основной индикатор выполнения, чтобы показать продвижение на задаче, работающей в отдельном потоке. |
ProgressBarDemo2 |
Этот раздел | Использует основной индикатор выполнения, чтобы показать продвижение на задаче, работающей в отдельном потоке. |
ProgressMonitorDemo |
Этот раздел | Модификация предыдущего примера, который использует монитор продвижения вместо индикатора выполнения. |
Если Вы программируете в JavaFX, см.