Пример 2. В одном файле несколько классов. Использования конструктора
Пример 4. Потоки
а) Геометрические фигуры
б) Синус-фигуры. Потоки и класс Math
в) Гонки. Интерфейс Runnable
г) Демонстрация задания 8
д) Демонстрация задания 9
е) Коды цветов.
a) События mouseDown, mouseMove, Event. Рисование произвольной линии
б)Вывод координат мышки
Пример 8. Графики тригонометрических функций
Пример 9. Прередача параметров в апплет. Тег <PARAM>
Пример 10. Получение данных от программы CGI
Пример 11. Загрузка файлов из каталогов веб-сервера
Пример 12. Коструктор и оператор return
Выполнить программу
б)апплет
Пример 2. Программы c двумя классами. Использование конструктором
КОНСТРУКТОРЫ
Заменим метод init из предыдущей программы конструктором.
Пример 1. Два варианта простейшай программы HeloWorld
а)выполнение из командной строки
Текст программы (файл HelloWorld.java )
public class HelloWorld
{ public static void main(String[] args)
{ System.out.println("Hello World!");
}
}
Cоздание байт-кода
(файл HelloWorld.java находится в каталоге C:\javaPrim\)
Сделать каталог с программой текущим:
C:\>cd javaPrim
Странслировать программу
C:\javaPrim>"C:\Program Files\Java\jdk1.7.0_06\bin\javac.exe" HelloWorld.java
Результат трансляции - файл HelloWorld.class
C:\javaPrim>java.exe HelloWorld
Напечатается
Hello World!
Апплет встроен в HTML-страницу HelloJava.html на сайте hello (в каталоге ../hello/www).
Текст страницы
<HTML><HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Апплет HelloWorld</title></head>
<BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0>
<H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center">
Пример использования Java</h2>
<APPLET CODE="HelloWorldApp.class" WIDTH="200" HEIGHT="140" ALIGN="left" ALT="Апплет">
Если вы видите этот текст, значит ваш браузер не поддерживает Java.</APPLET>
</body></html>
Текст программы (апплета) HelloWorldApp.
import java.applet.Applet;
import java.awt.*;
// Applet code for the "Hello, world!" example.
// This should be saved in a file named as "HelloWorldApp.java".
public class HelloWorldApp extends Applet
{ // This method is mandatory(обязательный), but can be empty (i.e., have no actual code).
public void init() { }
// This method is mandatory, but can be empty (i.e., have no actual code).
public void stop() { }
// Print a message on the screen (x=20, y=10).
public void paint(Graphics g)
{ g.drawString(" Маша! Здравствуй! Hello, world! ", 20,10);
// Draws a circle on the screen (x=40, y=30).
g.drawArc(40,30,50,50,0,360);
}
}
/*
Abstract Window Toolkit (AWT) — это исходная платформо-независимая оконная
библиотека графического интерфейса (Widget toolkit) языка Java.
Форма методов drawArc и fillArc следующая:
drawArc(int x, int у, int width, int height, int startAngle, int sweepAngle)
Эти методы вычерчивают (fillArc заполняет) дугу, ограниченную прямоугольником
(x,y,width, height), начинающуюся с угла startAngle и имеющую угловой размер
sweepAngle. Ноль градусов соответствует положению часовой стрелки на 3 часа,
угол отсчитывается против часовой стрелки (например, 90 градусов соответствуют
12 часам, 180 — 9 часам, и так далее).
*/
В результате выполнения апплета в окно браузера выведется текст
Маша! Здравствуй! Hello, world!
и окружность диаметром 50 пикселей
Просмотр примера 1б в браузере
Текст программы без конструктора (файл pr2.java в каталоге javaPrim)
class Point
{ int x, y;
void init(int x, int y)
{ this.x = x;
this.y = y;
}
}
class TwoPointsInit
{ public static void main(String args[])
{ Point p1 = new Point();
Point p2 = new Point();
p1.init(10,20);
p2.init(42,99);
System.out.println("x = " + p1.x + " y = " + p1.y)
System.out.println("x = " + p2.x + " y = " + p2.y);
}
}
В результате компиляции этой программы будут созданы в каталоге javaPrim файлы Point.class и TwoPointsInit.class
Точка входа в программу - метод main
Команда запуска программы
C:\javaPrim>java TwoPointsInit
В объектно-ориентированном программировании конструктор класса (от англ.
constructor, иногда сокращают ctor) — специальный блок инструкций, вызываемый
при создании объекта.
Конструктор схож с методом, но отличается от метода тем, что не имеет явным
образом определённого типа возвращаемых данных, не наследуется, и обычно имеет
различные правила для рассматриваемых модификаторов. Конструкторы часто
выделяются наличием одинакового имени с именем класса, в котором объявляется.
Их задача — инициализировать члены объекта и определить инвариант класса, сообщив
в случае некорректности инварианта. Корректно написанный конструктор оставит
объект в «правильном» состоянии. Неизменяемые объекты тоже должны быть
проинициализированы конструктором.
class PointK
{ int x, y;
//Конструкторы часто выделяются наличием одинакового имени с именем класса
//Здесь коструктор объявляет переменные (атрибуты) класса PointK
PointK(int x, int y)
{ this.x = x;
this.y = y;
}
}
class TwoPointsInitK
{ public static void main(String args[])
{//Создание объекта класса PointK и присвоение значений переменным созданного объекта
//вместо
//PointK p = new PointK();
//p.init(10,20);
PointK p1 = new PointK(10,20);
PointK p2 = new PointK(42,99);
System.out.println("x = " + p1.x + " y = " + p1.y);
System.out.println("x = " + p2.x + " y = " + p2.y);
}
}
Результат выполнения обеих программ:
x = 10 y = 20
x = 42 y = 99
Пример 3. Интерфейс
Интерфейс в Java играет ту же роль, что и блоки объявлений
переменных и функций в C
Интерфейс отличается от класса тем, что в нем можно объявить методы, но нельзя
реализовать их. Они реализуются в наследуемых классах.
Рассмотрим две программы. Вторая программа отличается от первой только тем, что в
ней используется интерфейс.
Текст программы без интерфейса
class Shoe { public String getName(int id) { if(id==1) return("Shoes"); if(id==2) return("Girl's shoes"); if(id==3) return("Boots"); return ("Unknow"); } } class Bread { public String getName(int id) { if(id==1) return("White"); if(id==2) return("Black"); if(id==3) return("Loaf"); return ("Unknow"); } } public class Wares { public static void main(String[] args) { Shoe a; a=new Shoe(); System.out.println(a.getName(1)); System.out.println(a.getName(2)); System.out.println(a.getName(3)); System.out.println(a.getName(4)); Bread b; b=new Bread(); System.out.println(b.getName(1)); System.out.println(b.getName(2)); System.out.println(b.getName(3)); } }В этой программе в классе Wares объекты Shoe и Bread хранятся в разных переменных. Интерфейс позволяет использовать для хранения объектов разных классов одну переменную.
Текст программы с интерфейсом
interface Ware { static final String origin="My corp"; public String getName(int id); } class Shoe implements Ware { public String getName(int id) { if(id==1) return("Shoes"); if(id==2) return("Girl's shoes"); if(id==3) return("Boots"); return ("Unknow"); } } class Bread implements Ware { public String getName(int id) { if(id==1) return("White"); if(id==2) return("Black"); if(id==3) return("Loaf"); return ("Unknow"); } } public class Proba { public static void main(String args[]) { Ware a; //Объявление переменной а типа интерфейс Ware a=new Shoe(); System.out.println(a.getName(1)); System.out.println(a.getName(2)); System.out.println(a.getName(3)); System.out.println(a.getName(4)); a=new Bread(); System.out.println(a.getName(1)); System.out.println(a.getName(2)); System.out.println(a.getName(3)); } }Результат выполнения обеих программ:
Shoes Girl's shoe Boots Unknow White Black LoafПример 4. ПОТОКИ
Пример 4a. Геометрические фигуры
Пример с сайта http://www.warayg.narod.ru/context/prog/Java/1/vol10/ch9.html .
См. также две предыдущие страницы ch7.html и ch8.html
В примере создается три потока. Первый поток рисует в окне аплета прямоугольники
случайного размера и цвета, второй - эллипсы, а третий управляет потоком рисования эллипсов.
import java.applet.*; import java.awt.*; public class Rectangles extends Applet { DrawRectangles m_DrawRectThread = null; DrawEllipse m_DrawEllipseThread = null; NotifyTask m_NotifyTaskThread = null; public String getAppletInfo() { return "Name: Rectangles"; } public void paint(Graphics g) { Dimension dimAppWndDimension = getSize(); 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); } public void start() { if (m_DrawRectThread == null) { m_DrawRectThread = new DrawRectangles(this); m_DrawRectThread.start(); } if(m_DrawEllipseThread == null) { m_DrawEllipseThread = new DrawEllipse(this); m_DrawEllipseThread.start(); } if (m_NotifyTaskThread == null) { m_NotifyTaskThread =new NotifyTask(m_DrawEllipseThread); m_NotifyTaskThread.start(); } } public void stop() { if (m_DrawRectThread != null) { m_DrawRectThread.stop(); m_DrawRectThread = null; } if (m_DrawEllipseThread == null) { m_DrawEllipseThread.stop(); m_DrawEllipseThread = null; } if (m_NotifyTaskThread != null) { m_NotifyTaskThread.stop(); m_NotifyTaskThread = null; } } } class DrawRectangles extends Thread { Graphics g; Dimension dimAppWndDimension; public DrawRectangles(Applet Appl) { g = Appl.getGraphics(); dimAppWndDimension = Appl.getSize(); } 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.fillRect(x, y, width, height); try { Thread.sleep(50); } catch (InterruptedException e) { stop(); } } } } class DrawEllipse extends Thread { Graphics g; Dimension dimAppWndDimension; public DrawEllipse(Applet Appl) { g = Appl.getGraphics(); dimAppWndDimension = Appl.getSize(); } public synchronized 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); try { this.wait(); } catch (InterruptedException e) { } } } } class NotifyTask extends Thread { Thread STask; public NotifyTask(Thread SynchroTask) { STask = SynchroTask; } public void run() { while (true) { try { Thread.sleep(30); } catch (InterruptedException e) { } synchronized(STask) { STask.notify(); } } } }Просмотр примера 4a в браузере
Пример 4в. Синус-фигуры. Класс Math
//Пример с сайта http://frolov-lib.ru/programming/javasamples/vol1/vol1_11/index.html import java.applet.*; import java.awt.*; public class Sinus extends Applet { DrawSinus m_DrawSinusThread = null;//Ссылка на поток класса DrawSinus, // созданный на базе класса Threa public String getAppletInfo() { return "Name: Rectangles"; } public void paint(Graphics g) { 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); } //Запускается поток DrawSinus public void start() { if (m_DrawSinusThread == null) { m_DrawSinusThread = new DrawSinus(this); m_DrawSinusThread.start(); } } public void stop() { if (m_DrawSinusThread != null) { m_DrawSinusThread.stop(); m_DrawSinusThread = null; } } } // ***************** //Класс, управляющий потоком class DrawSinus extends Thread { Graphics g; Dimension dimAppWndDimension; //Конструктор public DrawSinus(Applet Appl) { g = Appl.getGraphics(); dimAppWndDimension = Appl.size(); } //Управление потоком. Поток "просыпается" каждые 300 мс public void run() { // int k=0; // while (k<10) while (true) { //Создание массивов координат точек //k++; int nPoints = dimAppWndDimension.width; int[] xPoints = new int[nPoints]; int[] yPoints = new int[nPoints]; int rColor, gColor, bColor; int maxAngle = (int)((30 * Math.PI) *Math.random()); int Amplitude = (int)(dimAppWndDimension.height *Math.random()); int Offset = (int)(dimAppWndDimension.height *Math.random()); double deltaFi = (Math.PI / 2) *Math.random(); for(int i=0; i < nPoints; i++) { xPoints[i] = i; yPoints[i] = Offset + (int)(Amplitude * Math.sin(deltaFi + (double)((maxAngle * i)) / nPoints)); } rColor = (int)(255 * Math.random()); gColor = (int)(255 * Math.random()); bColor = (int)(255 * Math.random()); g.setColor(new Color( rColor, gColor, bColor)); g.fillPolygon(xPoints, yPoints, nPoints); try { Thread.sleep(300); } catch (InterruptedException e) { stop(); } } } }Просмотр примера 4b в браузере
Пример 4в. Гонки Поток реализуется классом Racer, объявленным от интерфейса Runnable
/*Слегка изменённый пример с сайта http://easyprog.ru/index.php?option=com_content&task=view&id=666&Itemid=29 В оригинале происходят три одинаковых процесса: по трём горизонтальным осям синхронно движутся три вытянутых эллипса ("гонщики"). В изменённом примере гонщики движутся с разными скоростями. Пример состоит из двух классов: Rase и Raser. Метод run() класса Racer задаёт темп каждого гонщика и с помощью repaint() - перерисовку всего изображения. Метод paint() рисует ось и эллипс-гонщика для каждого из трёх процессов. Вход в пограмму происходит с помощью методов init()и start()класса Rase В методе init() создаются два массива: - массив theRacers из трёх объектов (гонщиков); - массив theThreads из трёх потоков гонщиков Метод run() класса Race служит для отслеживания всех потоков и удаления их после завершения */ import java.awt.Graphics; import java.awt.GridLayout; //Класс Thtead принадлежит пакету lang (java.lang.Thread) public class Race extends java.applet.Applet implements Runnable { Racer theRacers[]; //массив гонщиков (объектов) static int count=3; //количество гонщиков Thread theThreads[]; //массив потоков Thread thisThread; //основной поток (поток, который управляет другими потоками) static boolean inApplet=true; int numberOfTheradAtStart; //в конце программы при помощи этой переменной //определяем, все ли потоки прекратили существование public void init() { numberOfTheradAtStart=Thread.activeCount(); // System.out.println("num="+numberOfTheradAtStart); //определеяем расположение гонщиков в окне, //они будут добавлятся один за друим setLayout(new GridLayout(count,1)); //создаем массивы гонщиков и потоков theRacers=new Racer[count]; theThreads=new Thread[count]; //в цикле создаем каждый элемент массивов for(int i=0;i<count;i++) { theRacers[i]=new Racer("Racer "+i); theRacers[i].resize(size().width,size().height/count); add(theRacers[i]); theThreads[i]=new Thread(theRacers[i]); } } //этой процедурой мы запускаем все потоки public void start() { for(int i=0;i<count;i++) theThreads[i].start(); thisThread=new Thread(this);//Поток этого класса (Rase) // System.out.println(numberOfTheradAtStart+" count="+Thread.activeCount()); } public void stop() { thisThread.stop(); } public void run() { // цикл, пока все гонщики не закончат гонку while(Thread.activeCount()>numberOfTheradAtStart+2) { try { thisThread.sleep(100); } catch (InterruptedException e) { System.out.println("thisTread was interruped"); } } if(inApplet) { stop(); destroy(); } else System.exit(0); } /* public static void main(String argv[]) { inApplet=false; Race theRace=new Race(); theRace.init(); theRace.start(); } */ } import java.awt.Graphics; import java.awt.Color; //класс поточный, поэтому он должен наследовать интерфейс Runnable public class Racer extends java.awt.Canvas implements Runnable { int position=0; String name; int stepsCount=600; boolean isFinished; //флаг, что гонщик пришел на финиш //конструктор класса //экземпляр класса создаем по имени public Racer (String aName) { name=aName; } public synchronized void paint(Graphics g) { //рисуем дорожку int x; String str; str=name; //имя текущего потока // System.out.println(str); g.setColor(Color.black); g.drawLine(0,size().height/2,size().width-170,size().height/2); //рисуем гонщика в виде желтого овала if(isFinished) g.setColor(Color.green); else g.setColor(Color.yellow); if(str.equals("Racer 1")) { g.setColor(Color.red); x=(int)(15*Math.random()); if(position>stepsCount-15)x=0; g.fillOval(x+position*(size().width-170)/stepsCount,0,15,size().height); } else g.fillOval(position*(size().width-170)/stepsCount,0,15,size().height); //если гонщик пришел на финиш, выдадим об этом сообщение if(isFinished) { g.setColor(Color.red); g.drawString("Racer '"+str+"'* is finished",size().width-150,size().height); } g.setColor(Color.red); g.drawString(""+position,0,size().height); } // public void run() { isFinished=false; //цикл до конца гонки while(position<stepsCount) { position++; repaint(); //останавливаем поток, чтобы началось отображение try { String str; str=name; //System.out.println(str); if(!str.equals("Racer 2"))Thread.currentThread().sleep(15); else Thread.currentThread().sleep(20); // System.out.println(str); //System.out.println("Текущий поток - "+Thread.currentThread().getName()+" name="+name); } catch (Exception e) {System.out.println("Exception on sleep");} } isFinished=true; repaint(); } }Для запуска программы браузером служит следующий html-документ:
<HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>Апплет Racer</title></head> <BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0> <H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center"> Пример использования Java Потоки</h2> <APPLET CODE="Race.class" WIDTH="200" HEIGHT="140" ALIGN="left" ALT="Апплет"> Если вы видите этот текст, значит ваш браузер не поддерживает Java.</APPLET> </body></html>Просмотр примера 4в в браузере
Пример 4е. Коды цветов в модели RGB
Метод paint переопределён в классе Multy2, а перерисовка (repaint)
производится из метода run() класса ColorThread. Для получения доступа к
методу repaint() в конструкторе класса ColorThread создаётся ссылка a = (Multy2)appl
//Пример с сайта http://frolov-lib.ru/programming/javasamples/vol6/vol6_2/index.html import java.applet.Applet; import java.awt.*; public class Multy2 extends Applet { Thread thrColor = null; Thread thrSize = null; int rColor, gColor, bColor; int nFontSize = 12; // ============================================ public void start() { if(thrColor == null) { thrColor = new SizeThread(this); thrColor.start(); } if(thrSize == null) { thrSize = new ColorThread(this); thrSize.start(); } } // ============================================ public void stop() { if(thrColor != null) { thrColor.stop(); thrColor = null; } if(thrSize != null) { thrSize.stop(); thrSize = null; } } // ============================================ public void paint(Graphics g) { String s; g.setColor(new Color(rColor, gColor, bColor)); s = "(R, G, B) = (" + rColor + ", " + gColor + ", " + bColor + ")"; g.setFont(new Font("Courier",Font.PLAIN, nFontSize)); g.drawString(s, 10, 30); } // ============================================ public String getAppletInfo() { return "Name: Multi2"; } } // ============================================ // ************* Class ColorThread ********** // ============================================ class ColorThread extends Thread { Multy2 a = null; //Поле c именем a хранит ссылку на аплет, то есть на объект //главного класса аплета Multi2 //Это поле инициализируется конструктором класса ColorThread: public ColorThread(Applet appl) { a = (Multy2)appl; } public void run() { while(true) { a.rColor = (int)(255 * Math.random()); a.gColor = (int)(255 * Math.random()); a.bColor = (int)(255 * Math.random()); a.repaint(); try { Thread.sleep(1000); } catch(InterruptedException ie) { stop(); } } } } // ============================================ // ************* Class SizeThread ************* // ============================================ class SizeThread extends Thread { Multy2 a = null; public SizeThread(Applet appl) { a = (Multy2)appl; } // ============================================ public void run() { boolean incr = true; while(true) { if(incr) { if(a.nFontSize < 30) a.nFontSize++; else incr = false; } else { if(a.nFontSize > 12) a.nFontSize--; else incr = true; } a.repaint(); try { Thread.sleep(100); } catch(InterruptedException ie) { stop(); } } } }Просмотр примера 4е в браузере
Пример 5. СОБЫТИЯ
a)События mouseDown, mouseMove, Event. Рисование произвольной линии
Для запуска программы браузером служит следующий html-документ:
<HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>Апплет DrawExample</title></head> <BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0> <H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center"> Рисование линий</h2> <APPLET CODE="DrawExample.class" WIDTH="600" HEIGHT="200" ALIGN="left" ALT="Апплет"> Если вы видите этот текст, значит ваш браузер не поддерживает Java.</APPLET> </body></html>Текст программы
/*Команда для трансляции C:\WebServers\home\prim.loc\www>"C:\Program Files\Java\jdk1.7.0_06\bin\javac" -Xlint:deprecation DrawExample.java Ключ Xlint:deprecation нужен для использования устарелых версий методов mouseDown(Event evt,int x, int y) и mouseMove (Event evt,int x, int y) */ import java.awt.*; import java.applet.*; public class DrawExample extends Applet { Point startPoint; Point points[]; int numPoints; boolean drawing; public void init() { startPoint= new Point(0,0); points=new Point[1000]; drawing=false; } public void paint(Graphics g) { int oldX=startPoint.x; int oldY=startPoint.y; for(int i=0; i < numPoints; ++i) { g.drawLine(oldX, oldY, points[i].x,points[i].y); oldX=points[i].x; oldY=points[i].y; } } public boolean mouseDown(Event evt,int x, int y) { if(!drawing) { startPoint.x=x; startPoint.y=y; } drawing=!drawing; return true; } public boolean mouseMove (Event evt,int x, int y) { if((drawing)&&(numPoints<1000)) { points[numPoints]=new Point(x,y); ++numPoints; repaint(); } return true; } }Просмотр примера 5 a) в браузере
Пример 5 б). Вывод координат мышки
Пример с сайта
http://frolov-lib.ru/programming/javasamples/vol2/vol2_9/index.html
import java.applet.Applet; import java.awt.*; public class EventProc extends Applet { Event ev = null; public void init() { setBackground(Color.yellow); setForeground(Color.black); } public String getAppletInfo() { return "Name: EventProc"; } public void paint(Graphics g) { if(ev != null) { g.drawString("[" + ev.x + "," + ev.y + "]", ev.x, ev.y); } } public boolean mouseDown( Event evt, int x, int y) { ev = evt; repaint(); return true; } }Просмотр примера 5 б) в браузере
Пример 6. Кнопки
http://frolov-lib.ru/programming/javasamples/vol3/vol3_1/index.html - описание класса Button
Для запуска программы браузером служит следующий html-документ:
<HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE>Апплет InternetApplet</title></head> <BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0> <H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center"> КНОПКИ</h2> <APPLET CODE="InternetApplet.class" WIDTH="600" HEIGHT="200" ALIGN="left" ALT="Апплет"> Если вы видите этот текст, значит ваш браузер не поддерживает Java.</APPLET> </body></html>Текст программы
import java.awt.*; import java.applet.*; public class InternetApplet extends Applet { String str; public void init() { Font font=new Font("TimesRoman",Font.PLAIN,24); setFont(font); Button button=new Button("Первая кнопка"); add(button); button=new Button("Вторая кнопка"); add(button); } public void paint(Graphics g) { g.drawString(str,60,130); } public boolean action(Event evt, Object arg) { if(arg=="Первая кнопка") str="Вы нажали на первую кнопку"; else if(arg=="Вторая кнопка") str="Вы нажали на вторую кнопку"; else str=""; repaint(); return true; } }Просмотр примера 6 в браузере
Пример 7. Экранные формы
Для запуска программы браузером служит следующий html-документ:
<HTML><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <TITLE>Апплет HelloWorld</title></head> <BODY vLink=#000066 bgColor=#fafcfe leftMargin=0 topMargin=0> <H2 style="color:770055;font-size:20pt;font-family:'times new roman';text-align:center"> Пример использования Java для создания экранных форм</h2> <TABLE align=center><TR><TD> <applet name="FormDemo" code="FormDemo" width="500" height="300" align="Top" alt="If you had a java-enabled browser, you would see an applet here."> <hr>If your browser recognized the applet tag, you would see an applet here.<hr> </applet> </table> </body></html>Тект программы
import java.applet.Applet; import java.awt.*; import java.util.*; public class FormDemo extends Applet { Button btReady; Checkbox chbox1; Checkbox chbox2; CheckboxGroup grRadio; Checkbox rd1; Checkbox rd2; Checkbox rd3; Choice ch1; Label lbFirstName; Label lbSecondName; TextField txtFirstName; TextField txtSecondName; TextArea txta; public void init() { chbox1 = new Checkbox("First"); add(chbox1); lbFirstName = new Label("Enter your first name:"); add(lbFirstName); txtFirstName = new TextField(" ", 30); add(txtFirstName); chbox2 = new Checkbox("Second"); add(chbox2); lbSecondName = new Label("Enter your second name:"); add(lbSecondName); txtSecondName = new TextField(" ", 30); add(txtSecondName); grRadio = new CheckboxGroup(); rd1 = new Checkbox("Mode 1", grRadio, true); rd2 = new Checkbox("Mode 2", grRadio, false); rd3 = new Checkbox("Mode 3", grRadio, false); add(rd1); add(rd2); add(rd3); ch1 = new Choice(); ch1.addItem("White"); ch1.addItem("Green"); ch1.addItem("Yellow"); add(ch1); setBackground(Color.yellow); lbFirstName.setBackground(Color.yellow); lbSecondName.setBackground(Color.yellow); rd1.setBackground(Color.yellow); rd2.setBackground(Color.yellow); rd3.setBackground(Color.yellow); chbox1.setBackground(Color.yellow); chbox2.setBackground(Color.yellow); txta = new TextArea("", 6, 45); add(txta); txta.setBackground(Color.white); btReady = new Button("Ready"); add(btReady); } public String getAppletInfo() { return "Name: FormDemo"; } public void paint(Graphics g) { Dimension dimAppWndDimension = getSize(); g.setColor(Color.black); g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); } public boolean action(Event evt,Object obj) { Button btn; String str1, str2; if(evt.target instanceof Button) { if(evt.target.equals(btReady)) { btn = (Button)evt.target; str1 = txtFirstName.getText(); str2 = txtSecondName.getText(); if(chbox1.getState()) txta.append(str1); if(chbox2.getState()) txta.append(str2); if(rd1.getState()) txta.append("\nMode 1\n"); if(rd2.getState()) txta.append("\nMode 2\n"); if(rd3.getState()) txta.append("\nMode 3\n"); } else { return false;} return true; } else if(evt.target instanceof Choice) { if(evt.target.equals(ch1)) { if(ch1.getSelectedIndex() == 0) txta.setBackground(Color.white); if(ch1.getSelectedIndex() == 1) txta.setBackground(Color.green); if(ch1.getSelectedIndex() == 2) txta.setBackground(Color.yellow); } } return false; } }Просмотр примера 7 в браузере
Пример 8. Графики тригонометрических функций
Сценарий. В поле со списком пользователь выбирает функцию и амплитуду.
После нажатия клавиши Enter или выбора функции строится график.
В примере используются:
import java.applet.*; import java.awt.*; import java.awt.event.*; // Пример из http://kek.ksu.ru/EOS/Java/gl3_4.html public class functions extends Applet implements ItemListener, ActionListener { private int n=20; // пикселов в единице private String name=""; // название функции private String str1="new"; private Choice tip=new Choice(); private TextField size; Panel p1=new Panel(); // панель для элементов управления functions.myCanvas p2=new functions.myCanvas(); // панель для рисования @Override public void init() { setLayout(new BorderLayout()); p1.setLayout(new GridLayout(2,2)); add("North",p1); add("Center",p2); p1.add(new Label("Выбирайте функцию: ")); tip.addItem("Синус"); tip.addItem("Косинус"); tip.addItem("Тангенс"); tip.addItemListener(this); p1.add(tip); p1.add(new Label("Пикселов в единичном отрезке:")); size=new TextField(""+n,5); p1.add(size); size.addActionListener(this); } @Override public void itemStateChanged(ItemEvent e) { if (e.getItemSelectable()==tip) { name=(String)e.getItem(); p2.repaint(); } } public void actionPerformed(ActionEvent e) { if (e.getSource()==size) { str1=size.getText(); n=Integer.parseInt(size.getText()); p2.repaint(); } } // Внутренний класс. Панель для рисования class myCanvas extends Canvas { int M, // ширина панели N, // высота панели x, y, xold, yold; public void paint (Graphics g) { M=getSize().width; N=getSize().height; setBackground(new Color(200,200,200)); g.drawLine(M/2,0,M/2,N); g.drawLine(0,N/2,M,N/2); for (x=0; x<M; x++) { if (name.equals("Синус")) { y=(int)(N/2-Math.sin((double)(x-M/2)/n)*n); } else if (name.equals("Косинус")) { y=(int)(N/2-Math.cos((double)(x-M/2)/n)*n); } else if (name.equals("Тангенс")) { y=(int)(N/2-Math.tan((double)(x-M/2)/n)*n); } else return; if (x==0) { xold=x; yold=y; } g.drawLine(xold, yold, x, y); xold=x; yold=y; } } }//Конец внутреннего класса }Просмотр примера 8 в браузере
Пример 9. Прередача параметров в апплет. Тег <PARAM>
Пример с сайта http://www.megapolis.org/internet/web_manual/web4c.html
В примере из HTML-документа в апплет передаются параметры. В апплете эти параметры печатаются.
Текст HTML-документа
<HTML> <HEAD> <TITLE>Тег PARAM>/TITLE> <META http-equiv="Content_Type" content="text/html;charset=windows-1251"> </HEAD> <APPLET code="MyParametes.class" width=500 height=300> <param name=NameBox value=Parameter> <param name=WidthBox value=555> <param name=AreaBox value=12345678> <param name=floatBox value=3.141592> <param name=activeBox value=true> </APPLET> </BODY> </HTML>Текст апплета
import java.awt.*; import java.applet.*; // Создаем класс MyParameters public class MyParametes extends Applet { // Обьявляем переменные для приема параметров String NameBox1 = new String(); int WidthBox1; long AreaBox1; float floatBox1; boolean activeBox1; // Прием параметров в методе start () public void start () { String param = new String(); // Прем первого - строкового параметра NameBox1 = getParameter("NameBox"); if (NameBox1 == null) NameBox1 = "Not Found"; // Прем второго - параметра типа int // Функция parseInt переводит из строкового // формата в целочисленный // Обработка исключительной ситуации // связана с прерыванием, которое может // возникнуть в этой функции, // когда перевод невозможен param = getParameter("WidthBox"); try { if (param != null) WidthBox1 = Integer.parseInt(param); else WidthBox1 = 0; } catch (NumberFormatException e) { WidthBox1 = -1; } // Прем третьего - параметра типа long // Функция parseLong переводит из строкового // формата в целочисленный param = getParameter("AreaBox"); try { if (param != null) AreaBox1 = Long.parseLong(param); else AreaBox1 = 0; } catch (NumberFormatException e) { AreaBox1 = -1; } // Прем четвертого - параметра типа float // Функция valueOf переводит из строкового // формата в формат с плавающей точкой param = getParameter("floatBox"); try { if (param != null) floatBox1 = Float.valueOf(param).floatValue(); else floatBox1 = 0; } catch (NumberFormatException e) { floatBox1 = -1; } // Прем пятого - параметра логического типа param = getParameter("activeBox"); if (param != null) activeBox1 = Boolean.valueOf(param).booleanValue(); } // Вывод в апплет значений полученных // и преобразованных параметров public void paint (Graphics dr) { dr.drawString ("NameBox : " + NameBox1 , 20, 20); dr.drawString ("WidthBox : " + WidthBox1 , 20, 70); dr.drawString ("AreaBox : " + AreaBox1 , 20, 120); dr.drawString ("floatBox : " + floatBox1 , 20, 170); dr.drawString ("activeBox : " + activeBox1 , 20, 220); } }Просмотр примера 9 в браузере
Пример 10. Получение данных от программы CGI
В примере из апплета вызывается скрипт, написанный на языке Perl.
Оператор вызова скрипта:
u=new URL("http://kafi5.loc/cgi/prosto.pl?n=50");
Для демонстрации возможности передачи параметров из апплета на веб-сервер
скрипту передаётся один параметр n.
Скрипт генерирует 10 случайных чисел в диапазоне от 0 до 100 и передаёт их
(вместе с полученным параметром) апплету.
Апплет выводит в своё окно текст Click me! и после щелчка мышкой по
тексту строит диаграмму, используя полученные с веб-сервера случайные числа.
Текст скипта
#!/usr/bin/perl use CGI qw(param); $m=param("n"); #$m=50; print "Content-type: text/plain\r\n\r\n"; print "100,$m"; for($i = 0; $i <9; $i++) { $n=rand()*100; printf ",%d",$n; }Текст апплета
import java.applet.*; import java.awt.*; import java.net.*; import java.io.*; import java.util.*; //Пример с сайта http://www.lib.csu.ru/DL/bases/prg/frolov/articles/mirpk/08.98/index.html public class izCGI extends Applet { // u - ссылка на адрес URL программы CGI URL u; // c - ссылка на объект класса URLConnection, // используемый как канал передачи данных при // взаимодействии аплета и программы CGI URLConnection c; // is - ссылка на входной поток класса DataInputStream, // по которому аплет получает данные от программы CGI DataInputStream is; // str - рабочее поле для хранения текстовой строки // со случайными числами, принятой от программы CGI String str = ""; String val[] = new String[11]; public void init() { for(int i=0; i <10; i++) val[i]="0" ; // вызываем метод repaint для перерисовки окна аплета // до обмена данными с программой CGI; при перерисовке // метод paint выводит в окне сообщение "Click me!" repaint(); } public void paint(Graphics g) { Integer iInteger; int maxWidth=0; int curWidth; // устанавливаем желтый цвет фона окна, определяем // размеры окна и обводим его черной рамкой setBackground(Color.yellow); //java.awt.Component.size() возвращает объект класса Dimension, содержащий размеры окна апплета Dimension dimAppWndDimension=size(); g.setColor(Color.black); g.drawRect(0, 0, dimAppWndDimension.width, dimAppWndDimension.height); // g.drawRect(0, 0, 200, 150); // для преобразования строк к типу int // создаем объект класса Integer iInteger=new Integer(val[0]); maxWidth=iInteger.intValue(); if(maxWidth== 0){ g.drawString("Click me!", 10, 100); } else { // выводим строку, полученную от программы CGI, в исходном // виде g.drawString(str, 10, 20); for(int i=1; i < 11; i++) { // выбираем случайным образом компоненты цвета // для изображения очередного столбца диаграммы int rColor=(int)(255 * Math.random()); int gColor=(int)(255 * Math.random()); int bColor=(int)(255 * Math.random()); g.setColor (new Color(rColor, gColor, bColor)); // извлекаем случайное значение, определяющее ширину столбца // диаграммы iInteger=new Integer(val[i]); curWidth=iInteger.intValue() + 1; g.fillRect(1, 10 + 20 * i, (300 * curWidth) / maxWidth, 20); // справа от столбцов диаграммы отображаем их ширину // в численном виде g.drawString(val[i], 10 + (300 * curWidth) / maxWidth, 24 + 20 * i); } } } public boolean mouseDown(Event evt, int x, int y) { try { // создаем объект u класса URL для загрузочного файла программы CGI //В скрипт передаётся переменная n=50 для демонстрации возможности передачи //параметров из апплета на веб-сервер u=new URL("http://kafi5.loc/cgi/prosto.pl?n=50"); c=u.openConnection(); // после соединения создаем поток для форматированного // ввода-вывода // данных от программы CGI is=new DataInputStream(c.getInputStream()); // читаем строку из входного форматированного потока str=is.readLine(); is.close(); // создаем объект класса StringTokenizer, передавая // конструктору через первый // параметр ссылку на разбираемую строку, а через второй // строку разделителей StringTokenizer StringTokenizer st=new StringTokenizer(str, ",\r\n"); int i=0; while(st.hasMoreElements()) { // разбираем строку и записываем токены в массив val val[i]=(String)st.nextElement(); i++; } repaint(); } catch (Exception ioe) { showStatus(ioe.toString()); } return true; } }Просмотр примера 10 в браузере
Пример 11. Загрузка файлов из каталогов веб-сервера
В примере выбранный файл загружается в текстовую область.
Текст апплета
import java.applet.*; import java.awt.*; import java.net.*; import java.io.*; import java.util.*; //В основу этого апплета положены два примера //В пример с сайта http://www.lib.csu.ru/DL/bases/prg/frolov/articles/mirpk/08.98/index.html //читается файл с веб-сервера, но не учитывается кодировка файла (utf-8, windows-1251 и т.д.) //Изменения для указания кодировки файла взяты с http://www.rte1.ru/softsamples/Java_ReadFile.html public class filSerw extends Applet {// tl - ссылка на объект класса Label Label tl; // txtURLAddress - ссылка на однострочное поле редактирования текста // используется для ввода адреса ресурса URL TextField txtURLAddress; // txt - ссылка на многострочное поле редактирования класса // TextArea, где после // загрузки будет отображено содержимое файла TextArea txt; // btnGetText - ссылка на кнопку класса Button Button btnGetText; byte buf[] = new byte[100]; public void init() // добавляем однострочное поле для ввода адреса URL, // кнопку, инициирующую процесс загрузки файла, // и многострочное поле редактирования для размещения текста прочитанного файла { tl = new Label("Введите адрес URL:"); add(tl); txtURLAddress = new TextField("http://", 50); add(txtURLAddress); txt = new TextArea("", 20, 70); btnGetText = new Button("Получить файл"); // добавляем поля редактирования add(btnGetText); add(txt); // устанавливаем желтый цвет фона для окна аплета setBackground(Color.yellow); } public boolean action(Event evt, Object obj) // загрузка файла ресурса, заданного своим адресом URL, // и отображение его в многострочном поле редактирования // txt. { String st; Button btn; // проверяем, вызвано ли это событие нашей кнопкой if(evt.target instanceof Button) { btn = (Button)evt.target; if(evt.target.equals(btnGetText)) { URL u; try { // создаем объект класса URL u = new URL(txtURLAddress.getText()); // Opens a connection to this URL and returns an InputStream for reading from that connection. InputStream is = u.openStream(); //Указывается кодировка файла InputStreamReader isr=new InputStreamReader( is,"utf-8"); //или "windows-1251" BufferedReader in = new BufferedReader(isr); while (((st = in.readLine()) != null)) { txt.append(st+"\n"); } in.close(); } // текст описания исключения записывается в строку состояния // браузера catch(Exception ioe) { showStatus(ioe.toString()); } } else return false; return true; } return false; } public void paint(Graphics g) { // определяем размеры окна Dimension dimAppWndDimension = size(); g.setColor(Color.black); // рисуем прямоугольную рамку по периметру g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); } }Просмотр примера 11 в браузере
Цена - 5 ves - 10
Пример 12. Конструктор и оператор return
Создаётся класс krug с шестью полями (свойствами)и два экземпляра круга
Приводятся два варианта создания экземпляров круга:
- без использования явно заданного конструктора;
- с конструктором.
Вариант без конструктора закомментирован.
Для расчёта длины окружности и площади круга служит метод alfa(),
возвращащий площадь круга.
Текст программы
package krug; import java.math.BigDecimal; import java.math.RoundingMode; public class Krug { public int D; public String cvetKruga; private String granicaVid; private String granicaCvet; private int Xkruga;//координаты центра private int Ykruga;//круга //Конструктор public Krug(int D,String cvetKruga,String granicaVid,String granicaCvet,int Xkruga,int Ykruga ) { this.D=D; this.cvetKruga=cvetKruga; this.granicaVid=granicaVid; this.granicaCvet=granicaCvet; this.Xkruga=Xkruga; this.Ykruga=Ykruga; } public static void main(String[] args) { //Поля двух экземпляров круга задаются без явного конструктора /* Krug krug1=new Krug(); krug1.D=80; krug1.cvetKruga="красный"; krug1.granicaVid="пунктир"; krug1.granicaCvet="синий"; krug1.Xkruga=100; krug1.Ykruga=120; Krug krug2=new Krug(); krug2.D=60; krug2.cvetKruga="зелёный"; krug2.granicaVid="сплошная линия"; krug2.granicaCvet="розовый"; krug2.Xkruga=50; krug2.Ykruga=70; */ //Поля двух экземпляров круга задаются с помощью конструктора Krug krug1=new Krug(80,"красный","пунктир","синий",100,120); Krug krug2=new Krug(60,"зелёный","сплошная линия","розовый",50,70); double S=krug1.alfa("круг 1"); System.out.println(" Площадь круга="+S); } private double alfa(String kr) { double L=Math.PI*D; //Округление до одного знака после запятой L = new BigDecimal(L).setScale(1, RoundingMode.HALF_UP).doubleValue(); double S=Math.PI*Math.pow(D/2,2); S= new BigDecimal(S).setScale(1, RoundingMode.HALF_UP).doubleValue(); System.out.println(kr + "\n Цвет круга - "+cvetKruga+".\n Диаметр - "+D+" " + "\n Длина окружности = "+L); return(S); } }Результат:
круг 1 Цвет круга - красный. Диаметр - 80 Длина окружности = 251.3 Площадь круга=5026.5