Проект "Выпуклая оболочка"
Аплеты и работа с ними
До сих пор мы не использовали богатейших возможностей, предоставляемых различными библиотеками языка Java, которые позволяют создавать удобные графические интерфейсы (GUI), ограничиваясь вводом/выводом текстовой информации с помощью класса Xterm. Вопросы создания полноценных графических интерфейсов выходят за рамки нашего курса, однако с простейшими методами вывода графической информации познакомиться весьма полезно.
Наилучший способ для этих целей — использование аплетов (applets). Аплеты значительно отличаются от обычных программ на языке Java, которые мы рассматривали до сих пор. Одним из важнейших отличий является то, что аплет не содержит метода main и не может быть запущен самостоятельно.
Аплеты запускаются с помощью браузера или специализированной программы для просмотра аплетов appletviewer, а для создания аплетов необходимо реализовывать подкласс класса Applet, определенного в пакете java.applet, являющимся составной частью библиотеки AWT.
Для целей вывода графической информации достаточно в классе, выведенном из класса Applet, переопределить метод paint. Мы познакомимся только с несколькими простейшими графическими примитивами:
- setColor — установить цвет, которым будут изображаться выводимые объекты;
- drawLine — изобразить отрезок прямой линии;
- drawRect — изобразить границу прямоугольника;
- drawOval — изобразить границу овала;
- fillRect — изобразить заполненный прямоугольник;
- fillOval — изобразить заполненный овал.
В качестве первого примера рассмотрим решение следующей задачи.
Задача 11.2. Создайте аплет,изображающий в окне размером 200х200 заполненный черный и синий прямоугольники, заполненный синий круг, красный отрезок, прямоугольник и овал.
Вот одно из возможных решений этой задачи.
Текст аплета
import java.awt.*; import java.applet.*; public class Primitives extends Applet { public void paint (Graphics g) { g.fillRect(20, 20, 40, 60); g.setColor(Color.red); g.drawLine(2, 2, 80, 80); g.drawOval(120, 120, 30, 40); g.drawRect(170, 170, 10, 15); g.setColor(Color.blue); g.fillOval(20, 150, 30, 30); } }
Операторы import обеспечивают подключение необходимых классов библиотеки AWT для компиляции этой программы, выполняемой обычным образом. После того, как компилятором будет создан файл Primitives.class, аплет можно запустить только создав дополнительно еще один файл — Primitives.html. Именно он должен быть указан в качестве аргумента программе appletviewer или браузеру. Содержимое этого файла может быть примерно таким.
HTML-файл
<HTML><BODY> <APPLET code="Primitives.class" width=200 height=200></APPLET> </BODY></HTML>
Содержательная информация здесь сводится к указанию имени запускаемого аплета и размеру окна, в котором этот аплет будет работать. После создания данного файла можно, наконец, запустить аплет, выполнив команду
appletviewer Primitives.html
Заметим, что начало координат размещается в левом верхнем углу окна, а ось ординат направлена вниз. Других комментариев созданный нами аплет не требует.
Рассмотрим более интересную задачу на построение графика функции.
Задача 11.3. Создайте аплет,изображающий в окне размером 200х200 оси координат и график функции y=x2-x на промежутке [-2,2].
Будем рисовать график этой функции путем изображения отдельных точек, применяя метод drawOval с равными единице третьим и четвертым аргументами, определяющими размер овала. Коэффициент позволяет изобразить график в нужном масштабе.
Текст аплета
import java.awt.*; import java.applet.*; public class FuncGraph extends Applet { private static final int SIZE = 200; private static final double k = 50.; private int f(double x) { return SIZE/2 - (int)(k * (x*(x*x-1))); } public void paint (Graphics g) { g.drawLine(0, SIZE/2, SIZE-1, SIZE/2); g.drawLine(SIZE/2, 0, SIZE/2, SIZE-1); g.setColor(Color.red); for (int i=0; i<SIZE; i++) { double x = (i - SIZE/2) / k; g.drawOval(i, f(x), 1, 1); } } }
Файл для запуска аплета вполне аналогичен предыдущему случаю:
HTML-файл
<HTML><BODY> <APPLET code="FuncGraph.class" width=200 height=200></APPLET> </BODY></HTML>
Построим теперь график функции, заданной в полярных координатах.
Задача 11.4. Создайте аплет,изображающий в окне размером 200х200 график функции, задаваемой в полярных координатах соотношением
Для решения задачи нужно знать, что константа доступна программам на языке Java, как величина Math.PI, а функции и — как методы Math.sin и Math.cos соответственно. На сей раз будем рисовать график, изображая отрезки прямых, соединяющие последовательно вычисляемые точки графика.
Текст аплета
import java.awt.*; import java.applet.*; public class FuncPolGraph extends Applet { private static final int SIZE = 200; private static final double k = 95.; private int x(double fi) { return SIZE/2 + (int)(k * Math.sin(3.*fi) * Math.cos(fi)); } private int y(double fi) { return SIZE/2 - (int)(k * Math.sin(3.*fi) * Math.sin(fi)); } public void paint (Graphics g) { setBackground(Color.white); g.setColor(Color.blue); int xp = x(0.), yp = y(0.); for (double fi=0.; fi<2.*Math.PI; fi+=Math.PI/180.) { if (Math.sin(3.*fi) < 0) continue; g.drawLine(xp, yp, x(fi), y(fi)); xp = x(fi); yp = y(fi); } } }
HTML-файл
<HTML><BODY> <APPLET code="FuncPolGraph.class" width=200 height=200></APPLET> </BODY></HTML>
Результат работы этой программы приведен на рисунке рис. 11.7.