Связанное свойство state содержит константы PENDING (до вызова метода doInBackground), STARTED (до вызова метода done), DONE (завершение задачи).
Текущее значение возвращается методом getState.
В этом примере мы создаем компонент JProgressBar, в конструкторе которого указываем минимальное и максимальное значения прогресс бара.
Метод setStringPainted (true) определяет, что в индикаторе отображается еще число – процент выполнения процесса.
В объекте SwingWorker мы используем его метод publish, который позволяет публиковать промежуточные результаты фонового вычисления в поток EDT.
Класс SwingWorker является типизированным.
Первый тип указывает тип значения, возвращаемый методом doInBackground, а второй тип указывает тип значения, публикуемый методом publish.
Публикуемое значение обрабатывается в методе process объекта SwingWorker.
Результаты множественных вызовов метода publish накапливаются для одного вызова метода process.
Поэтому его параметром служит список публикуемых значений.
Так как нас интересует последнее публикуемое значение, мы извлекаем его методом get из списка.
В методе doInBackground объекта SwingWorker с помощью метода setProgress мы изменяет значение связанного свойства progress.
Изменение этого свойства мы отслеживаем в слушателе объекта SwingWorker, который добавляем методом addPropertyChangeListener.
В обработчике этого слушателя мы извлекаем новое значение этого свойства и устанавливаем его как значение прогресс бара.
Метод setIndeterminate (true) устанавливает индикатор в неопределенный режим (indeterminate mode), в котором индикатор прокручивается в обе стороны.
Когда задача будет выполнена, нужно перевести индикатор в обычный режим методом setIndeterminate (false).
ProgressMonitor
Индикатор может работать в отдельном окне, эту возможность предоставляет класс ProgressMonitor.
Окно ProgressMonitor создается с помощью конструктора, в котором указывается родительский компонент, строка сообщения, строка, которую можно менять при прогрессе, и минимальное и максимальное значения индикатора.
Окно ProgressMonitor отображается самостоятельно.
После первых миллисекунд монитор прогресса сам определяет, сколько времени займет выполнение задачи.
Если это время больше, чем 2 секунды, появляется всплывающее окно индикатора.
В этом примере для изменения строки окна мы используем метод publish и метод process, в котором изменяем строку индикатора методом setNote.
В слушателе связанного свойства progress объекта SwingWorker мы изменяем значение индикатора методом setProgress.
Индикатор Progress Bar используется, если вы хотите контролировать конфигурацию.
Для Progress Bar вы можете установить его неопределенным, сделать его отображаемым по вертикали, отображать процент выполнения на нем.
Вместе с Progress Bar вы можете отображать другие компоненты.
Также вы можете отображать несколько индикаторов Progress Bar.
Вы можете повторно использовать индикатор Progress Bar.
Окно Progress Monitor нельзя использовать повторно.
После того, как монитор прогресса решил отобразить диалоговое окно, он не сможет сделать это снова.
Окно Progress Monitor используется, если вам нужен простой способ отображения прогресса в диалоговом окне.
Окно Progress Monitor предоставляет пользователю возможность отклонить диалог во время выполнения задачи.
Также задача может быть отменена с помощью кнопки Cancel окна.
Окно Progress Monitor предоставляет метод setNote, чтобы задача могла предоставить дополнительную информацию о том, что она делает.
Вы можете контролировать появление окна или его не появление в зависимости от времени выполнения задачи с помощью метода setMillisToPopup.
JMenuBar
Тяжеловесные окна верхнего уровня JFrame, JApplet и JDialog могут содержать панель меню горизонтально ниже заголовка окна.
Панель меню представлена классом JMenuBar.
Эта панель меню состоит из различных выборов меню, доступных конечному пользователю.
Кроме того, каждый выбор содержит список опций, который называется раскрывающимся меню.
Выбор меню представлен классом JMenu, а опция в списке представлена классом JMenuItem.
При этом видно, что класс JMenu расширяет класс JMenuItem.
Чем же отличаются выбор меню от опции в списке?
Во-первых, видно, что и тот и другой класс, это просто кнопки.
Но, выбор меню JMenu, в отличие от опции JMenuItem, обеспечивает всплывающее окно, содержащее JMenuItems, которое отображается, когда пользователь выбирает JMenu в панеле JMenuBar.
В дополнение к элементам JMenuItem, меню JMenu также может содержать разделители JSeparator.
По сути, меню представляет собой кнопку с ассоциированным всплывающим меню JPopupMenu.
Когда нажимается «кнопка», появляется всплывающее меню JPopupMenu.
Панель меню создается с помощью конструктора класса и добавляется в окно верхнего уровня методом setJMenuBar.
Затем создается само меню, которое добавляется в панель меню методом add.
Так как панель меню использует компоновку BoxLayout, а метод add позволяет добавлять любой Swing компонент, в панель меню можно добавить заполнитель класса Box, и меню окажется справа.