Главная Интернет WEB-учебник Java в примерах


Интернет клуб

Новая страница
Описание html
Javascript
Java в примерах

Что такое JAVA?
Первое приложение на JAVA
Первый апплет на JAVA
Управление шрифтами
Строковые переменные
Работа с массивами
Работа с графикой
Операции с мышкой
Операции с клавиатурой
Структура апплета
Работа с потоками
Передача параметров в апплет
Загрузка изображения в апплет
Контроль за ходом загрузки изображения
Двойная буферизация
Создание изображения из массива данных
Корректировка изображения

Полезные сайты
Задайте вопрос









Web-учебник. Раздел 4. Java в примерах.

Двойная буферизация







Любое изображение можно загрузить сначала в буфер, а затем, когда загрузка завершена, перегрузить в область вывода.
Эта перегрузка выполняется мгновенно, и пользователь не должен наблюдать долгую и нудную загрузку изображения по частям.
Пока идет загрузка, можно развлечь пользователя музыкой, глупыми вопросами. Можно на диаграмме показать, как идет процесс загрузки, сколько процентов осталось.
Размеры выводимого в данном разделе апплета - 300 x 430. Следовательно, изображение, которое мы будем вводить в область за пределами этого участка, будет для нас невидимо. Когда ввод изображения закончится, перегрузим его в видимую область.
При этом мы будем следить за ходом загрузки изображения с помощью метода imageUpdate .
Флаг SOMEBITS устанавливается при загрузке очередной порции изображения. При этом мы вычисляем и выводим на экран процент загрузки и диаграмму.
По концу загрузки устанавливается флаг ALLBITS и мы , используя логическую переменную ImageLoaded , сообщаем методу paint о необходимости вывода на экран уже готового изображения.

//------------------------------------------------------------  
//   Program :  MyThirdImage
//------------------------------------------------------------  
//   Author  :  Katz Yakov 
//------------------------------------------------------------  
//   Date    :  25/01/98
//------------------------------------------------------------  
import java.awt.*;
import java.applet.*;
//------------------------------------------------------------  
// Создание апплета MyThirdImage
public  class  MyThirdImage  extends  Applet{
   // Переменная для вычисления процента загрузки
   int persent;
   // Размеры апплета - для создания изображения 
   // за его пределами
   int XMax = 300;
   int YMax = 430;
   // Обьявление переменной для создания фонта
   // для вывода изображения на экран
   Font font1;
   // Логическая переменная указывает, завершена  
   // ли загрузка изображения
   boolean ImageLoaded = false;
   // Переменная типа класса Image служит для 
   // загрузки в нее изображения
   Image   picture;
   // Действия при загрузке апплета
   public void init() {
      // Создание нового фонта
      font1 = new Font("TimesRoman",Font.BOLD,18);
      // Начальное значение процента загрузки изображения
      persent = 0;
      // Присваивание графического файла обьекту
      picture = getImage(getCodeBase(),"SHISHKIN.JPG");
      // Создание нового обьекта, которому присваивается
      // графический контекст изображения вне экрана
      Image offScreenImage = createImage(XMax, YMax);
      Graphics grGraph = offScreenImage.getGraphics();
      // Вывод изображения в новом графическом контексте
      // за пределами экрана 
      grGraph.drawImage(picture, 0, 0, this);
   }
   // Использование контролера загрузки изображения 
   public boolean imageUpdate(Image img, int flags,
                  int x, int y, int w, int h) {
      // Загружена очередная порция изображения
      if ((flags & SOMEBITS) != 0) {
         // Вычисление нового процента загрузки
         persent = (y + h) * 100 / YMax;
         // Вызов перерисовки изображения
         repaint();
         return true;
      }
      // Завершена загрузка изображения
      if ((flags & ALLBITS) != 0) {
         // Установка значения логической переменной
         ImageLoaded = true;
         // Вызов перерисовки изображения
         repaint();
         return true;
      }
      return false;
   }
   // Перерисовка изображения
   public void paint(Graphics  gr) {
      // Установка нового фонта
      gr.setFont(font1);
      // Создание картинки изображения в апплете до 
      // загрузки изображения
      gr.setColor(Color.yellow);
      gr.fillRect(0, 0, 300, 430);
      gr.setColor(Color.navy);
      gr.fillRect(40, 20, 220, 40);
      gr.setColor(Color.white);
      gr.fillRect(50, 30, 200, 20);
      gr.setColor(Color.black);
      gr.drawString("Идет загрузка:            %", 40, 80);
      // Запись всяких глупых вопросов,
      // чтобы пользователь чем-то занялся
      // до завершения загрузки изображения
      gr.drawString("What greater : 3**7  or 7**3 ?", 20, 140);
      gr.drawString("Who stronger : elephant or whale ?", 20, 180);
      gr.drawString("Что больше : 3**7  или 7**3 ?", 20, 220);
      gr.drawString("Кто сильнее : слон или кит ?", 20, 260);
      // Если загрузеа изображения завершена,
      // то вывести его в апплет
      if (ImageLoaded) {
           gr.drawImage(picture, 0, 0, this);
      }
      // Если загрузеа изображения не завершена,
      // то вывести в апплет процент загрузки
      else {
         gr.setColor(Color.maroon);
         gr.fillRect(50, 30, 2 * persent, 20);
         gr.setColor(Color.yellow);
         gr.fillRect(180, 80, 40, 20);
         gr.setColor(Color.navy);
         gr.drawString(" " + persent , 180, 80);
      }
   }
}
При выводе апплета на моем компьютере есть следующие отличия в работе браузеров:
- Explorer правильно отображает кодировку русского текста, Netscape выводит неправильно,
- С другой стороны, Netscape нормально загружает изображение, а Explorer его вообще не загружает.
В общем, если бы к носу Парфирия Ивановича приставить губы Аграфены Кузьминичны...
А ведь в браузере JAVA все нормально...
Хочется плакать...
Я надеюсь, что это связано с особенностями моего компьютера, и у других все выглядит отлично... Напишите, пожалуйста.
Апплет выглядит следующим образом:







  ©1996-2007   Megapolis Org   E-mail:   info@megapolis.org