Индикатор хода процесса — простой компонент, помещаемый непосредственно в окно. Класс ProgressMonitor реализует достаточно сложное диалоговое окно, содержащее индикатор хода процесса. В этом окне есть кнопка Cancel(Отмена). Если пользователь щелкнет на ней, диалоговое окно монитора будет закрыто.
Кроме того, программа, выполнение которой отслеживается монитором, может проверять, закрыто ли диалоговое окно и если пользователь активизировал кнопку Cancel. Обратите внимание что имя класса, реализующего данный компонент, начинается не с буквы J.
При создании монитора задачи конструктору ProgressMonitor передаются следующие сведения:
- родительский компонент, поверх которого должно отображаться диалоговое окно;
- объект(строка пиктограмма или компонент), отображаемый в диалоговом окне;
- необязательное примечание, которое выводится под объектом;
- минимальное и максимальное значение.
Монитор не может самостоятельно определить, какая часть задачи выполнена, или завершить работу. Разработчик должен периодически обновлять состояние окна, вызывая метод setProgress(). Этот метод метод выполняет те же функции, что и метод setValue() класса JProgressBar.) Если необходимость в мониторе задачи отпала, нужно вызвать метод close(), удалив диалоговое окно с экрана. Впоследствии вы можете использовать то же окно, вызвав метод start().
Самой большой проблемой при использовании диалогового окна наблюдения за процессом является обработка запросов отмены. Невозможно присоединить обработчик события к кнопке Cancel. Вместо этого, необходимо периодически вызывать метод isCanceled, чтобы узнать, щелкнул ли пользователь программы на кнопке Cancel.
Если ваш рабочий поток может входить в состояние блокировки на неопределенный срок например при чтении введенных данных из сетевого соединения, то он не может наблюдать за кнопкой Cancel. В программе мы продемонстрируем, как используется таймер для этой цели. Кроме того, мы возложим на таймер ответственность за обновление измерений хода выполнения.
Управление временем происходит следующим образом. С помощью метода setMillisToDecideToPopup() задается число миллисекунд, которые должны пройти между созданием объекта диалогового окна и решением, следует ли отображать его.
По умолчанию принимается значение 500 миллисекунд. Метод setMillisToPopup() предназначен для оценки времени, необходимого для отображения диалогового окна.
Разработчики Swing установили это значение равным по умолчанию 2 секундам. Они учли тот факт, что диалоговые окна Swing не появляются так быстро, как хотелось бы.
Без необходимости изменять это значение не советуем.
Вот полный код программы: