2a9cfd0b

Выбираем случайный цвет для рисования


    dimAppWndDimension = Appl.size();

  }

  // -------------------------------------------------------

  // run

  // Метод, который работает в рамках отдельной задачи

  // Он рисует в окне аплета эллипсы случайного

  // цвета, размера и расположения

  // -------------------------------------------------------

  public void run()

  {

    while (true)

    {



      int x, y, width, height;

      int rColor, gColor, bColor;

     

      // Выбираем случайным образом размеры

      // и расположение рисуемого эллипса

      x = (int)(dimAppWndDimension.width * Math.random());

      y = (int)(dimAppWndDimension.height * Math.random());

      width  = (int)(dimAppWndDimension.width *

         Math.random()) / 2;

      height = (int)(dimAppWndDimension.height *

         Math.random()) / 2;

     

      // Выбираем случайный цвет для рисования эллипса

      rColor = (int)(255 * Math.random());

      gColor = (int)(255 * Math.random());

      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет

      // в контексте отображения

      g.setColor(new Color(rColor, gColor, bColor));

      // Рисуем эллипс

      g.fillOval(x, y, width, height);

      // Выполняем задержку на 50 миллисекунд

      try

      {

        Thread.sleep(50);

      }

      catch (InterruptedException e)

      {

        stop();

      }

    }

  }

}

В листинге 1.6 мы привели исходный текст документа HTML, предназначенного для совместной работы с нашим приложением.

Листинг 1.6. Файл MultiTask2\ MultiTask2.html

<html>

<head>

<title>MultiTask2</title>

</head>

<body>

<hr>

<applet

    code=MultiTask2.class

    id=MultiTask2

    width=320

    height=240 >

</applet>

<hr>

<a href="MultiTask2.java">The source.</a>

</body>

</html>



    s[0] = m_String1;

    s[1] = m_String2;

    s[2] = m_String3;

    s[3] = m_String4;

    s[4] = m_String5;

    s[5] = m_String6;

    // Получаем контекст отображения

    Graphics g = getGraphics();

    Dimension dimAppWndDimension = size();

    // Определяем метрики текущего шрифта

    FontMetrics fm = g.getFontMetrics();

    // Сохраняем полную высоту символов шрифта

    yChar = fm.getHeight();

    // Бесконечный цикл сдвига строк

    while (true)

    {

      try

      {

        // Увеличиваем содержимое счетчика сдвигов       

        ShiftsCounter++;

        // Если сдвинута полная строка, рисуем

        // следующую строку в нижней части окна

        if(ShiftsCounter == yChar + 5)

        {

          // Сбрасываем счетчик сдвигов

          ShiftsCounter = 0;

         

          // Первую строку отображаем красным цветом,

          // остальные - черным

          if(CurrentStr == 0)

            g.setColor(Color.red);

          else

            g.setColor(Color.black);

          // Рисуем строку

          g.drawString(s[CurrentStr],

            10, dimAppWndDimension.height - 10);

         

          // Увеличиваем счетчик строк

          CurrentStr++;

          // Если уже нарисовали шесть строк, сбрасываем

          // счетчик строк

          if(CurrentStr > 5)

            CurrentStr = 0;

        }

        // Устанавливаем шаг сдвига равным одному пикселу

        yShift = 1;

        // Выполняем свертку

        g.copyArea(0, yShift + 1,

          dimAppWndDimension.width  - 1,

          dimAppWndDimension.height - 1,

          0, -yShift);

        // Закрашиваем область ввода желтым цветом

        g.setColor(Color.yellow);

        g.fillRect(1, dimAppWndDimension.height

          - yShift - 1,

          dimAppWndDimension.width  - 2,

          dimAppWndDimension.height - 1);

       

        // Выполняем задержку в 50 миллисекунд



    Dimension dimAppWndDimension = size();

    // Определяем метрики текущего шрифта

    FontMetrics fm = g.getFontMetrics();

    // Номер текущего рисуемого символа строки

    int nCurrentChar = 0;

    // Позиция для рисования по вертикали

    int yPos = fm.getHeight() + 5;

    // Текущая позиция рисования символа по горизонтали

    int nCurrentXPos = 10;

    // Ширина текущего символа в пикселах

    int nCurrentCharWidth;

   

    // Бесконечный цикл рисования

    while (true)

    {

      try

      {

        try

        {

          // Определяем ширину текущего символа

          nCurrentCharWidth =

            fm.charWidth(m_Str.charAt(nCurrentChar));

          // Массив для преобразования кода символа в сивол

          char[] ch;

   

          // Временная строка

          String s;

          // Создаем массив из одного элемента

          ch = new char[1];

          // Записыаем в него код нажатой клавиши

          ch[0] = m_Str.charAt(nCurrentChar);

   

          // Преобразуем в строку

          s = new String(ch);

          // Рисуем текущий символ в текущей позиции

          g.drawString(s, nCurrentXPos, yPos);

          // Увеличиваем текущую позицию на ширину

          // нарисованного символа

          nCurrentXPos += nCurrentCharWidth;

          // Переходим к следующему символу в строке

          nCurrentChar++;

        }

        // Обработка выхода за пределы строки

        catch (StringIndexOutOfBoundsException e)

        {

          // Сбрасываем номер текущего символа и

          // текущую позицию

          nCurrentChar = 0;

          nCurrentXPos = 10;

          // Перерисовываем окно аплета

          repaint();

          // Задержка после перерисовки окна

          try

          {

            Thread.sleep(500);

          }

          catch (InterruptedException ee)

          {

            stop();



  Thread STask;

  // -------------------------------------------------------

  // Конструктор класса NotifyTask

  // -------------------------------------------------------

  public NotifyTask(Thread SynchroTask)

  {

    // Сохраняем ссылку на задачу, которую необходимо

    // разблокировать

    STask = SynchroTask;

  }

  // -------------------------------------------------------

  // run

  // Метод, который работает в рамках отдельной задачи и

  // периодически разблокирует задачу STask

  // -------------------------------------------------------

  public void run()

  {

    while (true)

    {

      // Выполняем задержку на 30 миллисекунд

      try

      {

        Thread.sleep(30);

      }

      catch (InterruptedException e)

      {

      }

      // Получаем объект STask в монопольное владение

      // и вызываем для него метод notify,

      // разблокируя работу соотвестсвующей задачи

      synchronized(STask)

      {

        STask.notify();

      }

    }

  }

}

Файл документа HTML, созданный автоматически для нашего аплета, вы найдете в листинге 1.12.

Листинг 1.12. Файл Synchro\Synchro.html

<html>

<head>

<title>Synchro</title>

</head>

<body>

<hr>

<applet

    code=Synchro.class

    id=Synchro

    width=320

    height=240 >

</applet>

<hr>

<a href="Synchro.java">The source.</a>

</body>

</html>


Содержание раздела