Вторник, 14.07.2026, 04:52
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
Меню
Форма входа
Категории раздела
Интернет статьи [9]
статьи [105]
Поиск
Мой сайт
Главная » Статьи » статьи

Достижению прогресса Мониторинг прогресса's Swing API
По Дженни зала
Обновлено 23 января 2009

В этот совет, вы узнаете, как использовать индикатор Swing поддержка для мониторинга и отчетности о ходе длительных операций. Это хорошая практика, чтобы пользователи не сообщили как они взаимодействуют с приложением; Один из способов сделать это с индикатором прогресса. Индикатора это Анимированные изображения, которое указывает на степень завершенности данной задачи. Анимация обычно выглядит как прямоугольный баре, который заполняет как задача становится более полным.

Мониторинг прогресса's Swing API состоит из трех классов, что позволяет использовать прогресс баров. JProgressBar подклассы JComponent и графический компонент, который иллюстрирует ход операции. Это могут быть встроены в другие графические компоненты. ProgressMonitor подклассов Object и не является самой графической составляющей. Она контролирует задачи и СОЗ диалогового окна с индикатором прогресса в ней. ProgressMonitorInputStream это поток фильтра связано с прогрессом монитора. Как читать поток, прогресс, монитор, автоматически получает обновленную информацию о количестве прочитанных байт и отображает процент выполненной работы в диалоговом окне.

Java Учебник дает хорошие практические правила, которые помогают определить соответствующий класс для использования в данной ситуации. Например, можно использовать JProgressBar когда вам нужно более одного индикатора или вы хотели бы получить больше контроля над конфигурацией прогресс бар. Если вам нужен удобный способ для отмены контроля задачу или позволить пользователю для закрытия диалогового окна, продолжая при этом выполнять задачу в фоновом режиме, ProgressMonitor предоставляет для этого. ProgressMonitor также особенностей модифицируемые сведению статуса в диалоговое окно, которое может быть периодически обновлять ваше приложение. Образец заявления на этот совет использует ProgressMonitor

Примеры применения

Копии образца приложения файлов, расположенных в исходном каталоге (в) в каталоге назначения (выход). Она Swing GUI, который позволяет пользователю для запуска операции копирования, нажав на кнопку "Копировать файлы, как показано на Рисунке 1.



Рисунок 1: Примеры применения

После запуска операции копирования, приложение создает ходе мониторинга, которая отслеживает объем работ завершен, и отображает эту информацию в диалог, содержащий прогресс бар. Приложение также пишет выходного о ходе операции в консоли, как показано на Рисунке 2.



Рисунок 2: Диалог содержащая индикатор

Как показано выше, графический интерфейс отображает количество килобайт скопированный файл и имя файла, в настоящее время копирования. Пользователь может отменить операцию в любое время, нажав на кнопку "Отмена". После завершения операции копирования, GUI выглядит как показано на Рисунке 3:



Пошаговое примера приложения

Пример приложения состоит из одного класса, ProgressMonitorExample что расширяет javax.swing.JPanel и реализует java.awt.event.ActionListener и java.beans.PropertyChangeListener ProgressMonitorExample 'S main() метод говорит потоке событий направить в графике выполнения Runnable который создает приложение с графическим интерфейсом:
  общественности статической Void Main (string [] аргументы) (
          / / Рассказать потоке событий направить в графике исполнения
          / / Это Runnable (которая создаст пример App GUI) на более позднее время
          SwingUtilities.invokeLater (новая Runnable () (
              общественности запустить Void () (
                  / / Создать окно примеру App
                  JFrame кадра = новый JFrame ( "Прогресс примере Monitor");
                  / / Заявка на выезд Закрыть
                  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
                  frame.setSize (DEFAULT_WIDTH, DEFAULT_HEIGHT);
                
                  / / Создание примера App панели контента
                  / / ProgressMonitorExample конструктор ли дополнительные настройки графического интерфейса
                  JComponent contentPane = новый ProgressMonitorExample ();
                  contentPane.setOpaque (TRUE);
                  frame.setContentPane (contentPane);                     
                  ...

ProgressMonitorExample содержит внутренний класс, CopyFiles что расширяет javax.swing.SwingWorker Когда пользователь нажимает на кнопку "Копировать файлы, ProgressMonitorExample 'S actionPerformed() Метод получает событие, создает новые ProgressMonitor и запускает файл-копирование в фоновом потоке. Вот код, который создает ProgressMonitor
  общественности Void actionPerformed (ActionEvent событие) (
          / / Убедитесь, что имеются файлы для копирования
          Файла srcDir = новый файл ( "в");
          если (srcDir.exists () & & (srcDir.listFiles ()! = NULL & & srcDir.listFiles (). длины> 0)) (
              / / Создать каталог назначения
              Файла DESTDIR = новый файл ( "Out");             
              / / Создание мониторинга прогресса
              ProgressMonitor = новый ProgressMonitor (ProgressMonitorExample.this,
                                                    "Операция продолжается ...",
                                                    "", 0, 100);
              progressMonitor.setProgress (0);
              ...

ProgressMonitor имеет один конструктор. Первый аргумент является родителем компонент диалогового окна прогресса монитора. Второй аргумент, тип Object отображается в диалоговом окне. Она должна быть строка, значок, или компонента. Этот пример поставок конструктор строку, которая позволяет пользователю узнать, что запрошенная операция ведется. Третий аргумент является дополнительным к сведению статус, который также появляется в диалоговом окне. Этот статус записка может быть периодически обновляться по мере контролируемой задание выполняется. Установите это значение в NULL, если нет статуса сведения не требуется. Четвертый и пятый аргументы приведены минимальные и максимальные значения индикатора в ходе мониторинга диалоговом окне.

Код, а также выдержки из actionPerformed() создает новый экземпляр CopyFiles добавляет ProgressMonitorExample качестве слушателя изменения свойств от случая, и выполняет, например:
  / / Расписание копировать файлы операцию на выполнение в фоновом потоке
      Operation = новый CopyFiles (srcDir, DESTDIR);
      / / Добавить ProgressMonitorExample в качестве слушателя на CopyFiles;
      / / Конкретного интереса связан прогресс собственности
      operation.addPropertyChangeListener (это);
      operation.execute ();
      / / Мы запуске наших операций; отключить кнопку "Копировать"
      copyButton.setEnabled (FALSE);

CopyFiles подклассы SwingWorker таким вызовом унаследованного метода execute() графиков CopyFiles на выполнение фонового потока и немедленно возвращается. Много времени, деятельность всегда должна работать в фоновом потоке, а не направление потока событий. Таким образом, графический интерфейс остается реагирования.

Хотя файл копирования операция началась, прогресс мониторе диалоговое окно не всплывал сразу. По умолчанию, ProgressMonitor ждет 500 мс до принятия решения о применении или не показывать диалог на всех. После этого периода времени прошло, если ProgressMonitor определяет, что контролируемые операции уже завершены или может завершить до диалогового окна могут быть отображены, ProgressMonitor не сует в диалоговом окне. ProgressMonitor 'S метода setMillisToDecideToPopup() контролирует эту настройку. setMillisToPopup() устанавливает оценкам количество времени, которое состоится в диалоговом окне появится, по умолчанию значение этого имущества составляет 2 секунды.

Реальная работа по копированию файлов происходит в doInBackground() абстрактный метод SwingWorker что CopyFiles перекрывает. Вот частичный перечень:
  / / Выполнение временных затрат задачу скопировать в рабочий поток
      @ Override
      Пустота общественности doInBackground () (
          Int прогресс = 0;
          / / Инициализация связан прогресс собственности (унаследованные от SwingWorker)
          setProgress (0);
          / / Получить файлы копируются из исходного каталога
          Файл [] = srcDir.listFiles файлами ();
          / / Определить сферу задач
          долгое TOTALBYTES = calcTotalBytes (файлы);
          долгое bytesCopied = 0;
        
          а ( "Прогресс <100 & &! isCancelled ()) (                  
              / / Скопировать файлы в каталог назначения
              для (файлы F: файлы) (
                  Файла йезЬГИе = новый файл (DESTDIR, f.getName ());
                  долгое previousLen = 0;
                
                  попробуйте (
                      InputStream в новом FileInputStream = (F);
                      OutputStream OUT = новый FileOutputStream (йезЬГИе);                     
                      Byte [] = BUF новых Byte [1024];
                      Int Counter = 0;
                      Int Len;
                    
                      While ((LEN = in.read (BUF))> 0) (
                          out.write (Buf, 0, Len);
                          Счетчик + = Len;
                          bytesCopied + = (destFile.length () - previousLen);
                          previousLen = destFile.length ();
                          если (счетчик> PROGRESS_CHECKPOINT | | bytesCopied == TOTALBYTES) (
                              / / Получить полную% для выполнения этой задачи
                              прогресс = (int) ((100 * bytesCopied) / TOTALBYTES);
                              Counter = 0;
                              CopyData ток = новый CopyData (прогресс, f.getName (), getTotalKiloBytes (TOTALBYTES), getKiloBytesCopied (bytesCopied));

                              / / Установить новое значение связано собственности
                              / / Прогресс и изменение свойств огня события
                              setProgress (прогресс);
                            
                              / / Публикация текущих данных прогресса копии задачи
                              опубликовать (текущий);
                          )
                      )
                      in.close ();
                      out.close ();
                  ) Поймать (IOException е) (
                      e.printStackTrace ();
                  )
              ...

doInBackground() получает любые файлы, расположенные в в каталоге и копирует их по одной в из каталога. Каждый раз, когда указанное количество байтов, которые были скопированы, приложение подсчитывает, какой процент от общего количества байт было скопировано до сих пор, а затем создает экземпляр внутреннего класса CopyData провести эту информацию вместе с общим числом килобайтов, количество килобайт скопировали сих пор, и имя файла в настоящее время копирования. Затем приложение обновлений связаны с прогрессом имущества рассчитывается в процентах, выпустив случае изменения свойств в процессе. Призыв к publish() делает нынешний прогресс копии задачи данные для обработки в направлении потока событий.

ProgressMonitorExample 'S propertyChange() Метод извлекает значения из прогресс случае изменение собственности. Затем он обновляет анимацию мониторинга прогресса путем вызова его setProgress() и передача хода значения. Вот код:
  / / Выполняется в случае направления потока
      общественности PropertyChange недействительным (PropertyChangeEvent событие) (
          / / Если операция будет закончена или была отменена
          / / Пользователь, принять соответствующие меры
          если (progressMonitor.isCanceled ()) (
              operation.cancel (TRUE);
          ) Else If (event.getPropertyName (). Equals ( "Прогресс")) (             
              / / Получить% от полного хода событий
              / / И установить его о ходе мониторинга
              Int прогресс = ((Integer) event.getNewValue ()). IntValue ();
              progressMonitor.setProgress (прогресс);             
          )         
      )


Обратите внимание, что ProgressMonitor предоставляет удобный способ определить, если диалог была отменена пользователем. Пример приложения в ответ на аннулирование пользователей путем прекращения мониторинга деятельности, но в другой ситуации было бы целесообразно, чтобы позволить пользователю для закрытия диалогового окна, а деятельность продолжает работать в фоновом режиме.

Переопределив process() SwingWorker метода process() CopyFiles можно использовать в ходе данных, предоставляемых при обращении к publish() для обновления GUI. process() действует в направлении потока событий, поэтому оно безопасно для обновления компонентов Swing в этом методе . Вот код:
  / / Процесс копия ходе выполнения задачи данные в случае направления потока
      @ Override
      Процесс общественного Void (Список   данные) (
          если (isCancelled ()) (Return;)
          CopyData Update = новый CopyData (0, "", 0, 0);
          для (CopyData D: данные) (
              / / Прогресс обновлений может быть в пакетном режиме, так что получить самую последнюю
              если (d.getKiloBytesCopied ()> update.getKiloBytesCopied ()) (
                  Обновление = D;
              )
          )
        
          / / Изменение статуса отмечаем прогресс, монитор с
          / / Последние ходе данной операции копирования и
          / / Дополнительно добавить примечание к консоли
          String progressNote = update.getKiloBytesCopied () + "от"  
                                Update.getTotalKiloBytes + () + Кб скопировал ".";
          FileNameNote String = "Теперь копирование" + update.getFileName ();
        
          если (update.getProgress () <100) (
              progressMonitor.setNote (progressNote + "" + fileNameNote);
              console.append (progressNote + "\ п" + fileNameNote + "\ п");
          () Другое
              progressMonitor.setNote (progressNote);
              console.append (progressNote + "\ п");
          )            
      )

Как показано выше, process() обновлений статуса отмечаем прогресс, монитор с количеством килобайт скопированы до сих пор, и имя файла в настоящее время скопировали, а затем добавляет эту информацию на консоль.

После завершения своей фоновом режиме, CopyFiles устанавливает свои собственные государства сделали и вызывает done() метод в направлении потока событий. done() вызывается методом SwingWorker get() которая возвращает окончательный результат фоновом режиме. В случае примера приложения, однако, нет окончательного результата обработки. Призывает пример приложения get() чтобы определить, действительно ли фоновая задача была отменена до ее завершения и реагирует соответствующим образом:
  / / Выполнение окончательного обновления в случае направления потока
      @ Override
      Пустота общественность сделали () (
          попробуйте (
              / / Вызов получить (), чтобы рассказать нам о том, операция завершена или  
              / / Было отменено, и мы ничего не делаем с этим результатом
              Пустота получить результат = ();
              console.append ( "Copy операция завершена. \ п");                 
          ) Поймать (InterruptedException е) (
            
          ) Поймать (CancellationException е) (
              / / Получить () бросает CancellationException была отменена, если фоновая задача
              console.append ( "Copy операция отменена. \ п");
          ) Поймать (ExecutionException е) (
              console.append ( "произошло исключение:" + e.getCause ());
          )
          / / Сброс на примере App
          copyButton.setEnabled (TRUE);
          progressMonitor.setProgress (0);
      )


Запуск примера приложения

Чтобы запустить пример приложения, загрузить образцы кода и распаковать его. Пример приложения предполагает, что имеются файлы скопировать в каталоге расположены в соответствии с проектом коренных, так что добавить (желательно большие) файлы на ваш выбор в этот каталог. Ракета NetBeans и выберите пункт File -> Open Project. В проект с открытым окном, перейдите в каталог, где вы распаковали образцы кода и выберите папку progressMonitorExample Выберите Открыть как основное окно проверки Проекта. Нажмите кнопку Open Project Folder. Щелкните правой кнопкой мыши проект progressMonitorExample и выберите Build, затем правой кнопкой мыши проект снова и выберите пункт Выполнить.
Категория: статьи | Добавил: Aleksei (15.10.2009)
Просмотров: 593 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 1
1 DealsersE  
0
Сдам 4-х квартaиру в жилом помплексе http://opa.od.ua/tags/%C6%EA+%C0%F0%EA%E0%E4%E8%E9%F1%EA%E8%E9+%E4%E2%EE%F0%E5%F6/ - Аркадийский дворец
Одесса. Рядом: клуб Вестерн, пляж из булыжников, футбольное поле и Веер. Недвижимость с офигенным авторским дизайном, перламутровой мебелью (Швейцария) и Одесской высококачественной бытовой техникой.

Имя *:
Email *:
Код *:
экология. Экологический портал. Картинки, обои, скриншоты из игр, программыCopyright Aleksei Kraev 11Б © 2026