Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2

© Александр Фролов, Григорий Фролов
Том 32, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Приложение ShowChart

Попробуем теперь на практике применить технологию передачи файлов из каталога сервера Web в аплет для локальной обработки. Наше следующее приложение с названием ShowChart получает небольшой текстовый файл с исходными данными для построения круговой диаграммы, содержимое которого представлено ниже:


10,20,5,35,11,10,3,6,80,10,20,5,35,11,10,3,6,80

В этом файле находятся численные значения углов для отдельных секторов диаграммы, причем сумма этих значений равна 360 градусам. Наш аплет принимает этот файл через сеть и рисует круговую диаграмму, показанную на рис. 3.2.

Рис. 3.2. Круговая диаграмма, построенная на базе исходных данных, полученных через сеть

Файл исходных данных занимает всего 49 байт, поэтому он передается по сети очень быстро. Если бы мы передавали графическое изображение этой диаграммы, статическое или динамическое, подготовленное, например, расширением сервера CGI или ISAPI, объем передаваемых по сети данных был бы намного больше.

Исходные тексты приложения

Исходные тексты приложения ShowChart приведены в листинге 3.3.

Листинг 3.3. Файл ShowChart\ShowChart.java


// =========================================================
// Рисование круговой диаграммы, данные для которой
// получены от сервера Web через сеть
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.util.*;

public class ShowChart extends Applet
{
  // Адрес URL файла с данными для круговой диаграммы
  URL SrcURL;

  // Содержимое этого файла
  Object URLContent;

  // Код ошибки
  int errno = 0;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: ShowChart\r\n" +
      "Author: Alexandr Frolov\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // -------------------------------------------------------
  // init
  // Метод, получающий управление при инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    try
    {
      // Создаем объект класса URL для файла с данными
      // для круговой диаграммы
      SrcURL = new URL("http://frolov/chart.txt");

      try
      {
        // Получаем содержимое этого файла
        URLContent = SrcURL.openConnection().getContent();
      }
      catch (IOException ioe)
      {
        showStatus("getContent exception");

        // При возникновении исключения во время получения
        // содержимого устанавливаем код ошибки, равный 1
        errno = 1;
      }
    }
    catch (MalformedURLException uex)
    {
      showStatus("MalformedURLException exception");

      // При возникновении ошибки в процессе создания
      // объекта класса URL устанавливаем код ошибки,
      // равный 2
      errno = 2;
    }
  }

  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Строка, в которую будет записано содержимое
    // файла данных для круговой диаграммы
    String sChart = "<error>";
    
    // Начальный угол сектора диаграммы
    Integer AngleFromChart = new Integer(0);
    
    // Угол предыдущего сектора диаграммы
    int PrevAngle = 0;

    // Случайные компоненты цвета сектора
    int rColor, gColor, bColor;

    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения желтый цвет
    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);

    // Проверяем, является ли полученное содержимое
    // текстовой строкой
    if(URLContent instanceof String)
    {
      sChart = (String)URLContent;
    }
    
    // Если нет, устанавливаем код ошибки, равный 3
    else
      errno = 3;

    // Если произошла ошибка, отображаем ее код
    // и полученные данные
    if(errno != 0)
      showStatus("errno: " + errno + ", sChart: " + sChart);
    
    // Если ошибки нет, отображаем полученные данные
    else
      showStatus(sChart);

    // Создаем разборщик текстовой строки для
    // выделения значений углов в принятом файле данных
    StringTokenizer st = 
      new StringTokenizer(sChart, ",\r\n");

    // Цикл по всем значениям
    while(st.hasMoreElements())
    {
      // Выбираем случайный цвет для рисования
      rColor = (int)(255 * Math.random());
      gColor = (int)(255 * Math.random());
      bColor = (int)(255 * Math.random());

      // Устанавливаем выбранный цвет в контексте 
      // отображения
      g.setColor(new Color(rColor, gColor, bColor));

      // Получаем значение угла
      String angle = (String)st.nextElement();

      // Преобразуем его в численное значение
      AngleFromChart = new Integer(angle) ;
      
      // Рисуем сектор диаграммы
      g.fillArc(0, 0, 200, 200, 
        PrevAngle, AngleFromChart.intValue());

      // Увеличиваем текущее значение угла
      PrevAngle += AngleFromChart.intValue();
    }
  }
}

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

Листинг 3.4. Файл ShowChart\ShowChart.html


<html>
<head>
<title>ShowChart</title>
</head>
<body>
<hr>
<applet
    code=ShowChart.class
    id=ShowChart
    width=200
    height=200 >
</applet>
<hr>
<a href="ShowChart.java">The source.</a>
</body>
</html>

Описание исходного текста

Приложение ShowChart получает содержимое файла исходных данных для построения круговой диаграммы с помощью класса URL. Как вы увидите, для получения содержимого этого файла оно не создает поток ввода явным образом, как это делало предыдущее приложение (хотя могло бы). Вместо этого оно пользуется методом getContent, определенным в классе URL.

Поля класса ShowChart

В классе ShowChart определены три поля.

Поле SrcURL класса URL хранит адрес URL файла исходных данных для круговой диаграммы. В поле URLContent типа Object будет переписано содержимое этого файла. И, наконец, в поле errno хранится текущий код ошибки, если она возникла, или нулевое значение, если все операции были выполнены без ошибок.

Метод init

Во время инициализации метод init создает объект класса URL для файла исходных данных:


SrcURL = new URL("http://frolov/chart.txt");

Здесь для экономии места в книге мы указали адрес URL файла исходных данных непосредственно в программе, однако вы можете передать этот адрес аплету через параметр в документе HTML.

Далее для нашего объекта URL мы создаем канал и получаем содержимое объекта (то есть исходные данные для построения диаграммы):


URLContent = SrcURL.openConnection().getContent();

Здесь использована двухступенчатая процедура получения содержимого с созданием канала как объекта класса URLConnection. Вы также можете упростить этот код, воспользовавшись методом getContent из класса URL:


URLContent = SrcURL.getContent();

Результат в обоих случаях будет одинаковый - содержимое файла исходных данных окажется записанным в поле URLContent класса Object.

Если при создании объекта класса URL возникло исключение, метод init записывает в поле errno код ошибки, равный 2, записывая при этом в строку состояния навигатора сообщение “MalformedURLException exception”.

В том случае, когда объект класса URL создан успешно, а исключение возникло в процессе получения содержимого файла, в поле errno записывается значение 1, а в строку состояния навигатора - сообщение "getContent exception".

Метод paint

После раскрашивания фона окна аплета и рисования вокруг него рамки метод paint приступает к рисованию круговой диаграммы.

Прежде всего метод проверяет, является ли полученный из сети объект текстовой строкой класса String. Если является, то выполняется явное преобразование типа:


if(URLContent instanceof String)
{
  sChart = (String)URLContent;
}

В случае успеха в переменной sChart будет находиться строка исходных данных для построения диаграммы, а при ошибке - строка “<error>”, записанная туда при инициализации. Кроме того, в поле errno записывается значение 3.

Далее метод paint проверяет, были ли ошибки при создании объекта URL, получении содержимого файла исходных данных или преобразования данных в строку класса String. Если были, то в строку состояния навигатора записывается код ошибки и содержимое строки sChart. Если же ошибок не было, то в строке состояния отображаются исходные данные:


if(errno != 0)
  showStatus("errno: " + errno + ", sChart: " + sChart);
else
  showStatus(sChart);

На следующем этапе обработчик paint приступает к построению диаграммы.

Первым делом создается разборщик строки исходных данных:


StringTokenizer st = 
  new StringTokenizer(sChart, ",\r\n");

В качестве разделителей для этого разборщика указывается запятая, символ возврата каретки и перевода строки.

Рисование секторов диаграммы выполняется в цикле, условием выхода из которого является завершение разбора строки исходных данных:


while(st.hasMoreElements())
{
  . . .
}

Для того чтобы секторы диаграммы не сливались, они должны иметь разный цвет. Цвет сектора можно было бы передавать вместе со значением угла через файл исходных данных, однако мы применили более простой способ раскаршивания секторов - в случайные цвета. Мы получаем случайные компоненты цвета сектора, а затем выбираем цвет в контекст отображения:


rColor = (int)(255 * Math.random());
gColor = (int)(255 * Math.random());
bColor = (int)(255 * Math.random());
g.setColor(new Color(rColor, gColor, bColor));

С помощью метода nextElement мы получаем очередное значение угла сектора и сохраняем его в переменной angle:


String angle = (String)st.nextElement();

Далее с помощью конструктора класса Integer это значение преобразуется в численное:


AngleFromChart = new Integer(angle) ;

Рисование сектора круговой диаграммы выполняется с помощью метода fillArc, который был рассмотрен в предыдущем томе “Библиотеки системного программиста”, посвященном языку программирования Java:


g.fillArc(0, 0, 200, 200, 
  PrevAngle, AngleFromChart.intValue());

В качестве начального значения угла сектора используется значение из переменной PrevAngle. Сразу после инициализации в эту переменную записывается нулевое значение.

Конечный угол сектора задается как AngleFromChart.intValue(), то есть указывается значение, полученное из принятого по сети файла исходных данных.

После завершения рисования очередного сектора круговой диаграммы начальное значение PrevAngle увеличивается на величину угла нарисованного сектора:


PrevAngle += AngleFromChart.intValue();
[Назад] [Содеожание] [Дальше]