Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот документ описывает изменения, которые мы производили, чтобы реализовать неопределенные индикаторы выполнения - компоненты GUI, которые выглядят подобными нормальным индикаторам выполнения и, как нормальные индикаторы выполнения, используют анимацию, чтобы показать, что происходит отнимающая много времени работа. В отличие от нормальных индикаторов выполнения, неопределенные индикаторы выполнения не показывают степень законченности работы. У этого документа есть следующие разделы:
По умолчанию, каждый индикатор выполнения (создаваемое использование одного из нескольких JProgressBar
конструкторы), является определенным. Можно сделать любого JProgressBar
неопределенное использование setIndeterminate
метод:
pb.setIndeterminate(true);
Неопределенный индикатор выполнения постоянно анимирует. Можно остановить анимацию и очистить индикатор выполнения, делая определенный индикатор выполнения и устанавливая текущую стоимость в минимум. Например:
pb.setValue(pb.getMinimum()); pb.setIndeterminate(false);
Можно переключиться от определенного до неопределенного режима, и наоборот, в любое время. Можно проверить, является ли индикатор выполнения неопределенным использованием isIndeterminate
метод.
Когда индикатор выполнения неопределенен, он игнорирует свою модель (a BoundedRangeModel
). Однако, модель должна существовать и содержать допустимые данные, с тех пор L&Fs, которые не были обновлены для неопределенных индикаторов выполнения, мог бы использовать модель.
Чтобы дать контроль разработчиков скоростью индикатора выполнения анимации, мы добавили два новых значения по умолчанию UI:
"ProgressBar.repaintInterval"
"ProgressBar.cycleTime"
"ProgressBar.cycleTime"
Значение по умолчанию UI позволяет разработчикам стили (так же как другие разработчики) определяют, сколько миллисекунд каждый цикл анимации берет. Например, время цикла 500 средств, которые анимация индикатора выполнения неопределенного режима повторяет дважды в секунду. Код для прорисовки по умолчанию использует это значение - наряду с интервалом перекрашивания, длиной поля, и компонентом внутренняя область - чтобы определить, как далеко переместить возвращающееся поле каждый раз, когда это оттягивается. Это значение должно быть даже многократно из интервала перекрашивания. Например, если интервал перекрашивания 100, то допустимое время цикла 200, 1000, и 1200, но не 100 или 500. Если пользователь определяет недопустимое время цикла, неопределенный код индикатора выполнения автоматически увеличивает время цикла до подходящего значения.
Установить интервал перекрашивания и значения по умолчанию времени цикла:
UIManager.put("ProgressBar.repaintInterval", new Integer(250)); UIManager.put("ProgressBar.cycleTime", new Integer(6000));
Получить интервал перекрашивания и время цикла:
int interval = UIManager.getInt("ProgressBar.repaintInterval"); int totalTime = UIManager.getInt("ProgressBar.cycleTime");
В основном, JLF, Мотиве, и реализациях Windows, обеспеченных Sun, проверяются эти значения по умолчанию, когда (и только когда) индикатор выполнения переключается в неопределенный режим.
Чтобы помочь программистам реализовать код стили для индикаторов выполнения, мы добавили следующий API к BasicProgressBarUI
класс.
Методы, связанные с рисованием:
protected void paintIndeterminate(Graphics g, JComponent c)
protected void paintDeterminate(Graphics g, JComponent c)
protected Rectangle getBox(Rectangle)
Методы для установки и получения индекса текущего фрейма анимации:
protected int getAnimationIndex()
protected void setAnimationIndex(int newValue)
protected void incrementAnimationIndex()
Методы для запуска и остановки пользовательских потоков анимации:
protected void startAnimationTimer()
protected void stopAnimationTimer()
paint
метод, который ранее выполнял все рисование для индикатора выполнения теперь, делегирует весь свой рисунок к также paintDeterminate
или paintIndeterminate
, В зависимости от значения неопределенного свойства индикатора выполнения. Когда индикатор выполнения находится в неопределенном режиме, paint
метод (и таким образом paintIndeterminate
метод), выполняет каждый интервал перекрашивания миллисекунды. paintIndeterminate
метод должен нарисовать индикатор выполнения, чтобы соответствовать состояние анимации, которое определяется getAnimationIndex
метод.
getBox
метод позволяет реализациям настраивать возвращающееся рисование поля. Например, MetalProgressBarUI
вызывает getBox
в paintIndeterminate
метод, чтобы потянуть поле суперклассом (BasicProgressBarUI
) и затем добавить схему к полю. Переопределяя getBox
метод, разработчик получает полный контроль над размером возвращающегося поля и позицией, не будучи должен повторно реализовать paintIndeterminate
.
Если Вы переопределяете paintIndeterminate
или getBox
, Вам, возможно, также придется переопределить incrementAnimationIndex
так, чтобы это циклически повторилось правильно через допустимые значения. Первое значение (представляющий первый рисунок) 0. Условно, второе 1, третье 2 и так далее. Последнее юридическое значение является, условно, общим количеством рисунков в цикле анимации, минус один. Чтобы определить общее количество рисунков, Вы, возможно, должны принять во внимание интервал перекрашивания и возможно компонентный размер. Как "условно" подразумевает, можно реализовать индекс анимации, чтобы иметь любое значение и оцениваете Вас желание, пока нуль указывает на начало цикла анимации.
Если Вы не хотите использовать поток анимации, мы обеспечиваем, следует переопределить два xxxAnimationTimer
методы. Можно тогда обеспечить свою собственную реализацию, которая периодически постепенно увеличивает индекс анимации и вызывает repaint
на индикаторе выполнения.
Как побочный эффект работы индикатора выполнения, мы добавили новый метод к SwingUtilities
:
public static Rectangle calculateInnerArea(Component c, Rectangle r)
calculateInnerArea
метод полезен для всех классов, которые выполняют рисунок. Это возвращает область, в которой компонент может потянуть - то есть, прямоугольник (в системе координат компонента), который включает весь компонент кроме его пограничной области (вставки компонента).
Преобразование существующего L&F к неопределенным индикаторам выполнения является относительно прямым. Если L&F индикатор выполнения класс UI не переопределяет paint
(или делает, но также и вызывает super.paint
), затем поддерживайте для неопределенных индикаторов выполнения, является автоматическим. WindowsProgressBarUI
, MotifProgressBarUI
, и MetalProgressBarUI
находятся в этом удачном лагере.
Если L&F индикатор выполнения класс UI является подклассом BasicProgressBarUI
и переопределения paint
не вызывая версию суперкласса, тогда определенный режим все еще работает, но неопределенный режим выглядит одинаково как определенный режим.
Существующий код для прорисовки должен быть перемещен из paint
метод и в новое paintDeterminate
метод. Код для неопределенного рисования должен войти в новое paintIndeterminate
метод. Если вообще возможно, paint
метод не должен быть переопределен, если он не вызывает super.paint
. Причина: BasicProgressBarUI
реализация paint
метод может работать с потоком анимации по умолчанию, чтобы улучшить производительность и поведение.
Стиль Mac (и больше сохраняемая версия Sun и версия Apple) является примером стили, который переопределяет paint
не вызывая версию суперкласса.
Если у Вас уже есть схема потока неопределенного рисования, можно продолжать использовать ту схему, переопределяя startAnimationTimer
и stopAnimationTimer
. Или можно только удалить свой код потока и использовать нашу схему.
BasicProgressBarUI
класс содержит большую часть нашей реализации неопределенных индикаторов выполнения. Кроме кода для прорисовки, большая часть кода находится в двух частных внутренних классах: Animator
, который реализует поток анимации, иPropertyChangeHandler
, который прислушивается к изменениям к и от неопределенного режима.
Animator
реализует поток анимации по умолчанию, используя Swing Timer
класс. Animator
экземпляр создается в случае необходимости BasicProgressBarUI.startAnimationTimer
метод, который вызывает обработчик свойства, когда индикатор выполнения переключается на неопределенный режим. Когда индикатор выполнения неопределенен, Animator
таймер запускает событие действия однажды каждый интервал перекрашивания миллисекунды. Animator
's обработчик событий действия вызывает incrementAnimationIndex
, сопровождаемый repaint
(который вызывает paintIndeterminate
работать). Интервал перекрашивания определяется ProgressBar.repaintInterval
Значение по умолчанию UI, которое проверяется startAnimationTimer
.
PropertyChangeHandler
регистрирует себя как слушатель свойства на индикаторе выполнения. Когда это обнаруживает "неопределенное" изменение свойства, обработчик обращает внимание на изменения и вызывает также stopAnimationTimer
или startAnimationTimer
.
public void
setIndeterminate(boolean newValue)public boolean
isIndeterminate()
В javax.swing.plaf.basic.BasicProgressBarUI
:
protected void
paintIndeterminate(Graphics g, JComponent c)protected void
paintDeterminate(Graphics g, JComponent c)protected int
getAnimationIndex()protected void
setAnimationIndex(int newValue)protected void
incrementAnimationIndex()protected void
startAnimationTimer()protected void
stopAnimationTimer()protected Rectangle
getBox(Rectangle r)
public static Rectangle
calculateInnerArea(JComponent c, Rectangle r)