Введение в Java

Цель занятия

Ознакомление с основами программирования в среде Java. Предполагается изучение краткого теоретического введения и разработка программы рисования графика наподобие изображенного на рис. 2.4. Работа связана с более подробным изучением апплетов, их методов и способов вывода информации. Рекомендуемаялитература [1, 2, 11, 15, 17].

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

Рис. 2.4. Апплет для рисования графика

Краткие теоретические сведения

Основным достоинством Java является возможность программировать в сетевой среде, например, в Интернете. Java позволяет создавать приложения на основе технологии "клиент-сервер". Приложение-сервер размещается на мощном сетевом компьютере и обрабатывает запросы клиентов, выполняющихся на локальных ЭВМ.

Приложения для Интернета называются апплетами, и один из них мы создадим на этом занятии. Приложения Java, не предназначенные для работы в Интернете, являются приложениями, основанными на фреймах (или формах, если они используют базовый класс Frame ИЛИ JFrame.

Апплет запускается на выполнение браузером Internet Explorer, когда браузер читает созданный нами HTML-файл. Апплет состоит ИЗ секций: start(), init(), stop(), destroy(), paint().

Не все секции следует указывать в апплете в общем случае. Секция init () выполняется только один раз при первом запуске апплета. Секция start() выполняется каждый раз при рестарте апплета из состояния ожидания. Секция stop () запускается при выходе из апплета, но при его сохранении. Секция destroy() запускается при окончательном закрытии окна апплета. Ясно, что ввиду разного временного порядка вызова этих секций их программирование существенно разнится по целям. Секция paint() служит для перерисовки изображения в окне апплета. Именно эта секция потребуется для рисования графика.

Программа на языке Java состоит из классов. Главный класс апплета должен быть объявлен, например, так:

public class labl extends Applet

Здесь iabi — имя класса. Ключевое слово public является модификатором доступа. Главный класс апплета должен иметь тип public, т. e. быть общедоступным. Другим возможным вариантом является отсутствие модификатора доступа, тогда класс доступен только из того пакета, в котором он описан. Java для каждого риЬИс-класса после компиляции создает файл с расширением class, причем имя этого файла совпадает с именем исходного Java-файла. Имя исходного Java-файла должно совпадать с именем класса, объявленного как public. В нашем примере следует сохранить текст программы для апплета в файле labl.java. Таким образом, логично создавать в программе только один публичный класс.

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

import java.applet.*; import java.awt.*; import java.awt.event.*;

Пакет java.applet.* содержит классы для поддержания работы с апплетами. Пакет java.awt.* содержит классы для обработки системных событий и пр.

Приведем пример апплета, результатом выполнения которого является приветствие, выведенное в окне браузера (листинг 2.4).

j Листинг 2.4. Апплет, выдающий приветствие

import java.applet.*; import java.awt.*; import java.awt.event.*; public class labl extends Applet

public void paint(Graphics g)

g.drawString("HELLO", 10,10) ;

Откомпилируйте этот апплет, задав в командной строке операционной системы (DOS): javac labl.java. Единственная эффективная команда g.drawstring(”HELLo”,i0,i0) приведенной программы служит для вывода строки (первый аргумент) в окно апплета с указанной позиции (х-координата, у-координтата). Переменная g используется для хранения графического контекста (тип Graphics). Запомните эту команду.

При работе с пакетом JSDK 1.* вам потребуется какой-нибудь редактор для DOS (например, Norton Commander или FAR). Если ошибок синтаксиса нет, то будет создан файл labl.class. Для запуска апплета на выполнение вам потребуется создать HTML- файл (файл с расширением html). Вот его возможный вид:

<html>

<applet code="labl.class"

width=4 00

height=400>

</applet>

</html>

Параметр code задает главный класс апплета. Сохраните этот файл под любым именем, но с расширением html. Для запуска апплета щелкните дважды по имени этого файла.

Команды языка Java имеют синтаксис С. Указатели не используются. Определение класса помещается в фигурные скобки. Теперь приведем полный текст программы для рисования графика (листинг 2.5) и дадим к нему пояснения.

Листинг 2.5. Приложение на основе апплета, выполняющее рисование графика

import java.applet.*; import java.awt.*; import java.awt.event.*;

public class labl extends Applet implements ActionListener

Button btnshow=new Button("SHOW");

Button btnhide=new Button("HIDE");

String msg="";

public void paint(Graphics g)

int x,y,xold,yold,step=10; if (msg.equals("show"))

{

xold=0;

yold=(int)Math.abs(Math.sin(Math.PI*xold/180)* (getSize().height- 100));

while (xold<399)

{

x=xold+step;

y=(int)Math.abs( Math.sin(Math.PI*xold/180)*

(getSize().height-100)); g. drawLine (xold, yold, x, y) ; xold=x; yold=y;

public void graph(String msgl)

{

Graphics g=getGraphics(); if(msgl.equals("show")) repaint(); else

if (msgl.equals("hide"))

{

g.setColor(getBackground());

g.fillRect(0,0,getSize().width,getSize().height)

}

showStatus(msgl);

}

public void init()

{

setLayout(null) ; add(btnshow); add(btnhide);

btnhide.setBounds(60,10,4 0,20); btnshow.setBounds(10,10,40, 20) ; btnshow.addActionListener(this) ; btnhide.addActionListener(this); setBackground(Color.yellow);

}

public void actionPerformed(ActionEvent a_e)

{

if (a_e.getSource()==btnshow)

{

msg="show"; graph (msg) ;

}

else

if (a_e.getSource()==btnhide)

{

msg="hide"; graph (msg) ;

}

}

}

Разберем более подробно код этой программы.

Определение главного класса апплета таково:

public class labl extends Applet implements ActionListener

Слова implements ActionListener ИСПОЛЬЗуЮТСЯ ДЛЯ ПОДКЛЮчения в класс апплета интерфейса ActionListener, который используется для написания реакции на нажатие кнопок и других элементов визуального интерфейса. В этом интерфейсе имеется метод:

public void actionPerformed(ActionEvent a_e),

который и определяет реакцию на нажатие кнопок.

Все используемые в программе переменные, кнопки и пр. должны быть объявлены. Как правило, объявления помещаются перед описанием методов. В нашем примере эти объявления таковы:

Button btnshow=new Button("SHOW");

Button btnhide=new Button("HIDE");

String msg="";

Здесь объявлены две кнопки: btnshow, btnhide (тип Button) и строка msg (тип string). Java различает заглавные и строчные буквы, поэтому Button и button суть разные объекты. Заметим, что в первых двух объявлениях программные кнопки прямо создаются конструкторами класса Button: new Button ("SHOW"). Аргументом команды является заголовок кнопки. Но можно было разделить объявление и создание кнопки:

Button btnshow;

btnshow= new Button("SHOW");

В логическом порядке далее следует рассмотреть метод init () апплета, где объявленные и созданные кнопки добавляются в окно апплета.

public void init()

{

setLayout(null) ; add(btnshow); add(btnhide);

btnhide.setBounds(60,10,4 0,20); btnshow.setBounds(10,10,40, 20) ; btnshow.addActionListener(this) ; btnhide.addActionListener(this); setBackground(Color.yellow);

}

Добавление кнопок выполняется командами add (btnshow), add(btnhide); установка размеров и координат кнопок — командами btnhide.setBounds(60,10,40,20), btnshow.set Bounds (10,10, 40,20); установка прослушивателя событий от кнопок — командами btnshow.addActionListener (this) , btnhide. addActionListener(this).

Команда setBackground(Coior.yeiiow) устанавливает цвет фона окна. Цвет — это объект класса coior. Поэтому в команду установки цвета передан аргумент coior.yeiiow. Команда setLayout (nuii) указывает, что для размещения кнопок в окне апплета не надо применять стандартный класс для размещения — на это указывает параметр nuii. В любом случае параметр nuii определяет, что объект или переменная не имеет значения.

Программа реакции на события от кнопок такова:

public void actionPerformed(ActionEvent a_e)

{

if (a_e.getSource()==btnshow)

{

msg="show"; graph (msg) ;

else

if (a_e.getSource()==btnhide)

{

msg="hide"; graph (msg) ;

}

}

Единственный аргумент этой функции a_e имеет тип Action- Event. Данный тип предоставляет метод getsource(), который возвращает источник события. Нетрудно сообразить, как этот метод используется и для чего. Видим, что в зависимости от того, какая кнопка нажата, переменная msg получает значение ”show” (показать график) или ”hide” (скрыть график). Переменная msg передается в качестве аргумента в метод graph (). Этот метод является единственным нестандартным методом в классе. Он анализирует, какое сообщение (msgi) пришло, и производит адекватную реакцию. Если пришло сообщение ”hide", то уничтожение графика выполняется следующим образом:

else

if (msgl.equals("hide"))

{

g.setColor(getBackground());

g.fillRect(0,0,getSize().width,getSize().height);

}

Команда g.fillRect(0,0,getSize().width,getSize().height) заливаетпрямоугольникскоординатами (0, о, getsize () .width, getsize() .height) цветом фона, предварительно установленным КОМанДОЙ g.setColor(getBackground()). Напомним, ЧТО g— ЭТО переменная графического контекста, а способ ее получения таков: Graphics g=getGraphics();

Метод getGraphics () принадлежит классу апплета. Этому же классу принадлежат методы getSize() .width, getSize () .height, KOTO- рые получают размеры окна апплета.

Как видим, метод graph() вызывает перерисовку окна апплета посредством обращения к repaint(), который уже непосредственно вызывает метод paint (). В методе paint о рисование линии графика выполняется в цикле while:

{

xold=0;

yold=(int)Math.abs(

Math.sin(Math.PI*xold/180)*(getSize().height-100)); while (xold<399)

{

x=xold+step;

y=(int)Math.abs(

Math.sin(Math.PI*xold/180)*(getSize().height-100));

g.drawLine(xold,yold,x,y) ;

xold=x;

yold=y;

}

}

Класс Math содержит набор методов и констант для выполнения алгебраических операций и преобразований. Пример обращения к этому классу дает команда:

Math.sin(Math.PI*xold/180)

которая вычисляет синус угла (в радианах) pi*xoid / i80; а сам угол xoid задается в градусах. Обратим внимание также на приведение типа в выражении y= (int)Math.abs (.. .) — правая часть приводится к типу int (целый).

Итак, программа рисования графиков разобрана.

В заключение теоретической части приведем сведения по некоторым важным графическим методам класса Graphics:

□      public void drawRect(int x,int у, int width, int height) — рисует прямоугольник, левый верхний угол которого имеет координаты (x, у), ш ирина — width, высота — height;

□                                                                       public void drawLine(int xl,int yl, int x2, int y2) —

рисует линию, связывающую две точки с заданными координатами;

□      public void setcoior (Color a) — устанавливает цвет рисуемых графических объектов. Цвет апплета можно установить методом setBackground(Color с), который принадлежит классу апплета;

□   public     void drawOval(int x,int у,  int   width, int

height) — рисует овал, вписанный в прямоугольник с заданными координатами;

□   public     void fillOval(int x,int у,  int   width, int

height) — заполняет прямоугольник текущим цветом, установленным командой setcoior;

□   public     void drawArc(int x,int у,  int   width, int

height,int startangle,int endangle) —рисует дугу (часть окружности), вписанную в прямоугольник заданного размера, заключенную между двумя лучами с углами int startangie, int endangle.

Приведем пример использования:

import java.applet.*; import java.awt.*; public class tl extends Applet {

public void paint(Graphics g)

{

for(int x=10; x<200; x+=20)

{

g.drawArc (20, 30, 20+x, 30+x, 0, 270) ;

}

}

}

Рисование многоугольника произвольной формы обеспечивает метод:

public void drawPolygon(int[] xpoints, int []ypoints, int number) .

number задает число вершин, координаты вершин берутся из массивов xpoints (х-координаты) и ypoints( у-координаты).

Заполнение многоугольника цветом выполняет метод:

public void drawPolygon(int[] xpoints, int [] ypoints, int number)

с тем же набором аргументов. Пример объявления и использования:

int x[]={2 0 0, 2 3 0, 4 0 0, 4 3 0}; int у[]={10 0, 2 0, 4 0, 6 0}; int num=4;

Graphics g=getGraphics(); g.drawPolygon(x,y,num);

Для получения рисунка его нужно предварительно объявить:

public Image img;

Далее нужно загрузить рисунок в память:

img=getImage(URL u, "name.gif");

Переменная и типа URL должна указывать            на сетевой адрес рисунка. Если рисунок находится там    же,                                                        где         и                       апплет, то следует

использовать команду:

img=getImage(getDocumentBase(),"name.gif");

Теперь остается отобразить рисунок:

public boolean drawImage (Image img, int x, int у, Im- ageObserver ob)

В качестве последнего параметра команды drawimage () следует указать this.

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100