Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

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

Этот документ описывает изменения, которые мы производили, чтобы реализовать неопределенные индикаторы выполнения - компоненты GUI, которые выглядят подобными нормальным индикаторам выполнения и, как нормальные индикаторы выполнения, используют анимацию, чтобы показать, что происходит отнимающая много времени работа. В отличие от нормальных индикаторов выполнения, неопределенные индикаторы выполнения не показывают степень законченности работы. У этого документа есть следующие разделы:

Новый API JProgressBar

По умолчанию, каждый индикатор выполнения (создаваемое использование одного из нескольких JProgressBar конструкторы), является определенным. Можно сделать любого JProgressBar неопределенное использование setIndeterminate метод:

    pb.setIndeterminate(true);

Неопределенный индикатор выполнения постоянно анимирует. Можно остановить анимацию и очистить индикатор выполнения, делая определенный индикатор выполнения и устанавливая текущую стоимость в минимум. Например:

    pb.setValue(pb.getMinimum());
    pb.setIndeterminate(false);

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

Когда индикатор выполнения неопределенен, он игнорирует свою модель (a BoundedRangeModel). Однако, модель должна существовать и содержать допустимые данные, с тех пор L&Fs, которые не были обновлены для неопределенных индикаторов выполнения, мог бы использовать модель.

Новые Значения по умолчанию UI

Чтобы дать контроль разработчиков скоростью индикатора выполнения анимации, мы добавили два новых значения по умолчанию UI:

"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

Чтобы помочь программистам реализовать код стили для индикаторов выполнения, мы добавили следующий API к BasicProgressBarUI класс.

Методы, связанные с рисованием:

Методы для установки и получения индекса текущего фрейма анимации:

Методы для запуска и остановки пользовательских потоков анимации:

paint метод, который ранее выполнял все рисование для индикатора выполнения теперь, делегирует весь свой рисунок к также paintDeterminate или paintIndeterminate, В зависимости от значения неопределенного свойства индикатора выполнения. Когда индикатор выполнения находится в неопределенном режиме, paint метод (и таким образом paintIndeterminate метод), выполняет каждый интервал перекрашивания миллисекунды. paintIndeterminate метод должен нарисовать индикатор выполнения, чтобы соответствовать состояние анимации, которое определяется getAnimationIndex метод.

getBox метод позволяет реализациям настраивать возвращающееся рисование поля. Например, MetalProgressBarUI вызывает getBox в paintIndeterminate метод, чтобы потянуть поле суперклассом (BasicProgressBarUI) и затем добавить схему к полю. Переопределяя getBox метод, разработчик получает полный контроль над размером возвращающегося поля и позицией, не будучи должен повторно реализовать paintIndeterminate.

Если Вы переопределяете paintIndeterminate или getBox, Вам, возможно, также придется переопределить incrementAnimationIndex так, чтобы это циклически повторилось правильно через допустимые значения. Первое значение (представляющий первый рисунок) 0. Условно, второе 1, третье 2 и так далее. Последнее юридическое значение является, условно, общим количеством рисунков в цикле анимации, минус один. Чтобы определить общее количество рисунков, Вы, возможно, должны принять во внимание интервал перекрашивания и возможно компонентный размер. Как "условно" подразумевает, можно реализовать индекс анимации, чтобы иметь любое значение и оцениваете Вас желание, пока нуль указывает на начало цикла анимации.

Если Вы не хотите использовать поток анимации, мы обеспечиваем, следует переопределить два xxxAnimationTimer методы. Можно тогда обеспечить свою собственную реализацию, которая периодически постепенно увеличивает индекс анимации и вызывает repaint на индикаторе выполнения.

Как побочный эффект работы индикатора выполнения, мы добавили новый метод к SwingUtilities:

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.

Javadoc для Нового API

В javax.swing.JProgressBar:

    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)


В javax.swing.SwingUtilities:

    public static Rectangle calculateInnerArea(JComponent c, Rectangle r)

Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами