Оглавление

Рисование в окне
Контекст отображения
Установка атрибутов
Определение атрибутов
Рисование фигур
Аплет Draw
Исходные тексты
Проект аплета

    Исходные тексты аплета Draw

    Исходные тексты аплета Draw вы найдете в листинге 1.

    Листинг 1. Файл draw.java

    import java.applet.*;
    import java.awt.*;
    
    public class draw extends Applet
    {
      Toolkit tk;
      String szFontList[];
      FontMetrics fm;
      int yStart = 20;
      int yStep;
      String parm_TestString;
      
      public void init()
      {
        tk = Toolkit.getDefaultToolkit();
        szFontList = tk.getFontList();  
        parm_TestString = 
          getParameter("TestString");
      }
    
      public String getAppletInfo()
      {
        return "Name: draw";
      }
    
      public void paint(Graphics g)
      {
        int yDraw;
        Dimension dimAppWndDimension = getSize();
        
        g.clearRect(0, 0, 
          dimAppWndDimension.width  - 1, 
          dimAppWndDimension.height - 1);
        
        g.setColor(Color.yellow);
        g.fillRect(0, 0, 
          dimAppWndDimension.width  - 1, 
          dimAppWndDimension.height - 1);
    
        g.setColor(Color.black);
        g.drawRect(0, 0, 
          dimAppWndDimension.width  - 1, 
          dimAppWndDimension.height - 1);
    
        fm = g.getFontMetrics();
        yStep = fm.getHeight();
        
        for(int i = 0; i < szFontList.length; i++)
        {
          g.setFont(new Font("Helvetica", 
            Font.PLAIN, 12));
          g.drawString(szFontList[i], 10, 
            yStart + yStep * i);
          
          fm = g.getFontMetrics();
          yStep = fm.getHeight();
          
          g.setFont(new Font(szFontList[i], 
            Font.PLAIN, 12));
          g.drawString(parm_TestString, 
            100, yStart + yStep * i);
        }
    
        yDraw = yStart + yStep * szFontList.length
          + yStep;
    
        Polygon p = new Polygon();
      
        p.addPoint(70, yDraw);
        p.addPoint(150, yDraw + 30);
        p.addPoint(160, yDraw + 80);
        p.addPoint(190, yDraw + 60);
        p.addPoint(140, yDraw + 30);
        p.addPoint(70, yDraw + 39);
    
        g.drawPolygon(p);
    
        g.setColor(Color.red);
        g.drawRect(10, yDraw + 85, 200, 100);
    
        g.setColor(Color.black);
        g.drawArc(10, yDraw + 85, 
          200, 100, -50, 320);
      }
      
      public String[][] getParameterInfo()
      {
        String[][] info =
        {
          {
    	"TestString", "String", "Test string" 
          }
        };
        return info;
      }
    }

    Метод init

    При инициализации аплета метод init извлекает список доступных шрифтов и принимает значение параметра TestString, передаваемое аплету в документе HTML.

    Извлечение списка шрифтов

    Процедура извлечения списка доступных шрифтов достаточно проста и выполняется следующим образом:

    Toolkit tk;
    String szFontList[];
      . . .
    tk = Toolkit.getDefaultToolkit();
    szFontList = tk.getFontList();  

    Аплет вызывает статический метод getDefaultToolkit из класса Toolkit и затем, пользуясь полученной ссылкой, извлекает список шрифтов, записывая его в массив szFontList.

    Для чего еще можно использовать класс Toolkit?

    Класс Toolkit является абстрактным суперклассом для всех реализаций AWT. Порожденные от него классы используются для привязки различных компонент конкретных реализаций.

    Создавая свои аплеты, вы будете редко прибегать к услугам этого класса. Однако в нем есть несколько полезных методов, прототипы которых мы перечислим ниже:

    • getDefaultToolkit

    Получение ссылки на Toolkit

    public static Toolkit getDefaultToolkit();	
    • getColorModel

    Определение текущей цветовой модели, выбранной в контекст отображения

    public abstract ColorModel getColorModel();	
    • getFontList

    Получение списка шрифтов, доступных аплету

    public abstract String[] getFontList();
    • getFontMetrics

    Получение метрик заданного шрифта

    public abstract FontMetrics 
      getFontMetrics(Font font);
    • getImage

    Получение растрового изображения по имени файла

    public abstract Image 
      getImage(String filename);
    • getImage

    Получение растрового изображения по адресу URL

    public abstract Image getImage(URL  url);	
    • getScreenResolution

    Определение разрешения экрана в точках на дюйм

    public abstract int getScreenResolution();
    • getScreenSize

    Размеры экрана в пикселах

    public abstract Dimension getScreenSize();
    • prepareImage

    Подготовка растрового изображения для вывода

    public abstract boolean prepareImage(
      Image image,
      int width, int height,
      ImageObserver observer);
    • sync

    Синхронизация состояния Toolkit

    public abstract void sync();

    Наиболее интересны, с нашей точки зрения, методы getFontList, getScreenResolution и getScreenSize, с помощью которых аплет может, соответственно, получить список шрифтов, определить разрешение и размер экрана. Последние два параметра позволяют сформировать содержимое окна аплета оптимальным образом исходя из объема информации, который может в нем разместиться.

    Получение значения параметров

    До сих пор наши аплеты не получали параметров из документов HTML, в которые мы их встраивали.

    Конечно, все константы, текстовые строки, адреса URL и другую информацию можно закодировать непосредственно в исходном тексте аплета, однако, очевидно, это очень неудобно.

    Пользуясь операторами <PARAM>, расположенными в документе HTML сразу после оператора <APPLET>, можно передать аплету произвольное количество параметров, например, в виде текстовых строк:

    <applet
        code=MyApplet.class
        id=MyApplet
         . . .
        width=320
        height=240 >
        <param name=ParamName1 value="Value 1">
        <param name=ParamName2 value="Value 2">
        <param name=ParamName3 value="Value 3">
        <param name=ParamName4 value="Value 4">
         . . .
    </applet>

    Здесь через параметр NAME оператора <PARAM> передается имя параметра аплета, а через параметр VALUE - значение соответствующего параметра.

    Как параметр может получить значение параметров?

    Для получения значения любого параметра аплет должен использовать метод getParameter. В качестве единственного параметра этому методу передается имя параметра аплета в виде строки типа String, например:

    parm_TestString = getParameter("TestString");

    Обычно в аплете также определяется метод getParameterInfo, возвращающий информацию о параметрах. Вот исходный текст этого метода для нашего аплета Draw:

    public String[][] getParameterInfo()
    {
      String[][] info =
      {
        {
          "TestString", "String", "Test string" 
        }
      };
      return info;
    }

    Метод getParameterInfo возвращает массив массивов текстовых строк. Первая строка указывает имя параметра, вторая - тип передаваемых через него данных, а третья - значение параметра по умолчанию.

    Метод paint

    Первым делом метод paint определяет размеры окна аплета, вызывая для этого метод getSize:

    Dimension dimAppWndDimension = getSize();

    Метод getSize возвращает ссылку на объект класса Dimension, хранящий высоту и ширину объекта:

    • height

    Высота

    public int height;
    • width

    Ширина

    public int width;

    В классе Dimension предусмотрено три конструктора и один метод:

    public Dimension();
    public Dimension(Dimension  d);
    public Dimension(int width, int height);
    • toString

    Получение строки, представляющей класс

    public String toString();

    После определения размеров окна аплета метод paint стирает содержимое всего окна:

    g.clearRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    Далее в контексте отображения устанавливается желтый цвет:

    g.setColor(Color.yellow);

    Этим цветом заполняется внутренняя область окна аплета, для чего применяется метод fillRect:

    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    Затем метод paint устанавливает в контексте отображения черный цвет и рисует тонкую черную рамку вокруг окна аплета:

    g.setColor(Color.black);
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    На следующем этапе мы получаем метрики текущего шрифта, выбранного в контекст отображения:

    fm = g.getFontMetrics();

    Пользуясь этими метриками, мы определяем высоту символов текущего шрифта и записываем ее в поле yStep:

    yStep = fm.getHeight();

    После этого метод paint запускает цикл по всем шрифтам, установленным в системе:

    for(int i = 0; i < szFontList.length; i++)
    {
      . . .
    }

    Количество доступных шрифтов равно размеру массива szFontList, которое вычисляется как szFontList.length.

    Метод paint выписывает в окне аплета название каждого шрифта, устанавливая для этого шрифт Helvetica размером 12 пикселов:

    g.setFont(new Font("Helvetica", 
      Font.PLAIN, 12));
    g.drawString(szFontList[i],
      10, yStart + yStep * i);

    Смещение каждой новой строки с названием шрифта вычисляется исходя из высоты символов установленного шрифта:

    fm = g.getFontMetrics();
    yStep = fm.getHeight();

    После названия шрифта метод paint рисует в окне аплета текстовую строку parm_TestString, полученную через параметр с именем "TestString":

    g.setFont(new Font(szFontList[i], 
      Font.PLAIN, 12));
    g.drawString(parm_TestString, 
      100, yStart + yStep * i);

    Перед тем как перейти к рисованию геометрических фигур, метод paint запоминает в поле yDraw координату последней строки названия шрифта, сделав отступ высотой yStep :

    int yDraw;
    yDraw = yStart + 
      yStep * szFontList.length + yStep;

    Первая фигура, которую рисует наш аплет, это многоугольник.

    Мы создаем многоугольник как объект класса Polygon:

    Polygon p = new Polygon();

    В этот объект при помощи метода addPoint добавляется несколько точек:

    p.addPoint(70,  yDraw);
    p.addPoint(150, yDraw + 30);
    p.addPoint(160, yDraw + 80);
    p.addPoint(190, yDraw + 60);
    p.addPoint(140, yDraw + 30);
    p.addPoint(70,  yDraw + 39);

    После добавления всех точек метод paint рисует многоугольник, вызывая для этого метод drawPolygon:

    g.drawPolygon(p);

    Затем мы устанавливаем в контексте отображения красный цвет и рисуем прямоугольник:

    g.setColor(Color.red);
    g.drawRect(10, yDraw + 85, 200, 100);

    Затем метод paint вписывает в этот прямоугольник сегмент окружности:

    g.setColor(Color.black);
    g.drawArc(10, yDraw + 85, 
      200, 100, -50, 320);

    Документ HTML для аплета Draw

    Документ HTML для аплета Draw не имеет никаких особенностей. Он представлен в листинге 2.

    Листинг 2. Файл draw.tmp.html

    <applet
       name="draw"
       code="draw" 
       codebase="file:/e:/Sun/Articles/vol4/src/draw"
       width="250"
       height="350"
       align="Top"
       alt="If you had a java-enabled browser,
     you would see an applet here."
    >
    <param name="TestString" value="Test string">
       <hr>If your browser recognized the applet tag, 
       you would see an applet here.<hr>
    </applet>


Java | Продукты и решения | Технологии | Сервис и обучение
О компании | Партнеры | Новости | Поиск
Sun Microsystems Inc. Corporate Information Our partners News and Events Search on site Java Computing Products and Solutions Technologies and Researches Education and Service Content



Сайт создан в системе uCoz