Програмування Java. Застосування аплетів


Програмування Java. Застосування аплетів

Мова програмування Java була створена в 90-х роках минулого століття як результат дослідницького проекту фірми Sun, причому вже тоді його можна було використовувати для різних додатків. Конкретним приводом послужив бум в області використання Всесвітньої павутини. Мова Java слід розглядати як мову, що ідеально підходить для роботи в Інтернеті.

Зрозуміло, будь-яка мова програмування використовує досвід розробки попередніх мов. У зв'язку з цим, мова Java дуже схожа на C++. Причини цього у використанні об'єктно-орієнтованого стилю програмування, високої продуктивності та потужності С++. Але, звісно ж, є деякі відмінності між цими мовами.
Наприклад:

  1. Відсутні покажчики (динамічний управління пам'яттю здійснюється засобами операційної пам'яті).
  2. Функції замінені методами, як елементи класів.
  3. Немає структур та об'єднань.
  4. Масиви та рядки існують тільки як об'єкти.
  5. Відсутнє визначення типів (typedef).
  6. Не підтримується множинне спадкування.
  7. Неможливе перезавантаження операторів.

Було б абсолютно помилково представляти мову Java як невелику частину С++. За потужністю Java навряд чи поступається чимось С++. В університетах Німеччини та США мова Java вважається стандартною мовою програмування.
1.3 Перший додаток
У багатьох підручниках з мов програмування починають з маленької програми, яка виводить на дисплей повідомлення "Hallo Welt!". Приєднаємось до цієї традиції. Як інструментальний засіб для розробки автономних програм і аплетів Java ми будемо використовувати середовище розробки Eclipse.

01 // Перший додаток
02 public class HalloWelt{
03 public static void main(String[] args){
04 System.out.println("Hallo Welt!");
05 }
06 }

Ось результат нашої першої програми

програмування java апплети

Перший рядок коду //

Перший додаток - це коментар, коментар починається подвійними похилими рисами, званими слішами. Багаторядкові коментарі ми можемо залишати за допомогою пар /* і */ :
/* Це рядки
Коментарі */

Структура Java-додатки складається з основного класу, який декларується як
Public class ім'я_класу
з методом public static void main (String [] args).


Розберемо детальніше це завдання, щоб зрозуміти з чого складається фундамент нашого завдання
У рядку public class HalloWelt ми визначаємо клас із ім'ям HalloWelt. Початок та кінець класу визначають фігурні дужки. Слово public це модифікатор доступу, який встановлює, чи можуть інші класи звертатися до HalloWelt.

Java-додаток складається з класів. Класи складаються з визначень змінних і методів, і саме в цих методах записані фактичні команди, які повинна виконувати Java-програма. Основним класом всередині окремого коду вважається клас, де визначено метод main(). Виконання коду починається з першої команди у функціональному каркасі main().

Наступне слово - static. За допомогою цього слова оголошуються методи та змінні класу, які використовуються для роботи з класом у цілому. Методи, в оголошенні яких використано ключове слово static, можуть безпосередньо працювати тільки з локальними та статичними змінними.
Порожні дужки показують, що метод не передаються ніякі параметри. Слово void показує, що метод не повертає жодного результату

System. out. prlntln("Hallo Welt!");

Ця рядок виводить повідомлення Hallo Welt на екран. Для цього є спеціальні команди. Є певна послідовність команд, яка реалізує метод println() із стандартного комплекту мови Java. Для виведення тексту потрібно лише передати його методу println(). Об'єкт out оголошений у класі OutputStream і статично ініціалізується у класі System.

Масиви в Java

У мові java є масиви. Ці масиви типизовані.
Декларація Point myPoints []; описує змінну myPoint як масив об'єктів типу Point. Завести масив певного розміру можна за допомогою:

myPoints = новий Point[10];

Значення елементів масиву при цьому встановлюється рівними спеціальної величини null.
Розмір масиву може бути отриманий під час виконання програми:

howMany = myPoints. Length;

Для створення масиву ми можемо використовувати квадратні дужки, розташувавши їх праворуч від імені масиву або від типу об'єктів, з яких складений масив, наприклад:

Int Numbers[];
Int[] AnotherNumbers;

Допустимі обидва варіанти, тому можна використовувати той, який нам більше подобається.
Під час визначення масивів у мові Java не можна вказувати їх розмір. Наведені вище два рядки не викликають резервування пам'яті для масиву. Тут просто створюються посилання на масиви, які без ініціалізації використовувати не можна. Для того щоб замовити пам'ять для масиву, потрібно створити відповідні об'єкти за допомогою ключового слова new, наприклад:

Int [] AnotherNumbers;
AnotherNumbers = int [15];

Як виконати ініціалізацію осередків таблиці?
Таку ініціалізацію можна виконати або статистично, або динамічно.У першому випадку можна просто перераховувати значення у фігурних дужках, наприклад:

Int [] ColorRed = {255, 255, 100, 0, 10};
Динамічна ініціалізація виконується з використанням індексу масиву, наприклад, у циклі :
Int InitialValue = 7;
Int [] AnotherNumbers;
AnotherNumbers = New int[15];
For(int I = 0; i<15; i++)
{
AnotherNumbers[i] = InitialValue;
}


Можливо створювати масиви як зі змінних базових типів, а й з довільних об'єктів. Кожен елемент такого масиву повинен ініціалізуватись оператором new. Наприклад:

Int[] [] nValue = new int [5] [10];
nValue[0] = new int [4];
nValue[1] = new int [6];
nValue[2] = new int [8];

Рядки символів є об'єктами типу String (текстові константи) або SringBuffer (рядки, що змінюються).

Об'єкт типу String. Робота з рядками

Однією з найважливіших класів, представлених у Java, є клас String. String-об'єкти дозволяють маніпулювати послідовністю символів і можуть бути об'єднуватися за допомогою оператора +:

String text = "Це рядок!";
String newText = text + “ І ще один рядок! ”;


Оскільки рядкові об'єкти посиланнями, вони вказують місце у пам'яті, де вміщено перший символ рядка. Однак рядки мають особливість: ми не можемо їх більше змінити! Об'єктна змінна text за такого розгляду – не змінна, а константа.
Це важливий ефект: якщо до поточного об'єкта String приєднується ще послідовність символів, як показано вище, за допомогою оператора +, то об'єкт text не розширюється насправді, а замінюється новим String-об'єктом. Так як породження нових об'єктів займає деякий час, то такі операції, як об'єднання рядків, призводить до втрати швидкодії.
Що спільного у всіх рядків? Це довжина, тобто. кількість символів. Для отримання довжини рядка є метод length():
Int dlina = text.Length();
Перетворення рядків.
У кожному класі String є метод toString – або власна реалізація, або стандартний варіант, успадкований від класу Object. Клас у прикладі заміщає успадкований метод toString своїм власним, що дозволяє йому виводити значення змінних об'єкта.

Class Point {
Int x, y;
Point(int x, int y) {
This.x = x;
This.y = y;
}
Public string toString() {
Return “point[“+x+”,”+y+”]”;
} }
Class toStringDemo{
Public static void main (String args[]) {
Point p = new point(10, 20);
System.out.println(“p = “ + p);
} }

Нижче наведено результат, отриманий під час запуску цього прикладу.

програмуємо на java створення апплету

Видубування символів.

Для того, щоб витягти одиночний символ з рядка, ми можемо послатися безпосередньо на індекс символу в рядку за допомогою методу charAt. Якщо потрібно за 1 раз витягти кілька символів, то можна скористатися методом getChars.

Class getCharsDemo {
Public static void main(String args[]) {
String s = “це є Demo de the getChars method.”;
Int start = 10;
Int end = 14;
Char buf [] = New char [end - start];
s.getChars(start, end, buf, 0);
System.out.println(buf);
} }

Зверніть увагу - метод getChars не включає у вихідний буфер символ з індексом end.

Для зручності роботи в String є ще одна функція - toCharArray, яка повертає у вихідному масиві типу Char весь рядок. Альтернативна форма того самого механізму дозволяє записати вміст рядка в масив типу byte, при цьому значення старших байтів в 16-бітних символах відкидаються. Відповідний метод називається getBytes , і його параметри мають той самий сенс, що і параметри getChars, але з єдиною різницею - як третій параметр треба використовувати масив типу byte.

Java аплети

Аплети – це Java-програми, які можуть бути вбудовані на WEB-сторінки. Якщо користувач Інтернету відкриває Web-сторінку з вставленим у неї аплетом, то аплет разом із HTML-кодом Web-сторінки проглядається браузером і запускається виконання (за умови встановленого Java-плагіна). Якщо потрібно вставити в сайт Java-аплет, то спочатку потрібно запрограмувати аплет, помістити в HTML-код Web-сайту, зберегти HTML-документ і аплет разом на комп'ютері.

Перший апплет Java

Наш перший аплет, окрім виведення вітання, більше нічого не повинен робити

// це перший аплет

Public class HalloWWW extends java.applet.Applet {
Public void paint(java.awt.Graphics gs) {
Gc.drawString(“Привіт, WWW!”,100,100);
}
}

Основна структура аплета виглядає дещо інакше, ніж структура Java-додатка. Як базовий клас використовується java.applet.Applet, від якого успадковується наш Applet-клас. З іншого боку, немає методу main().
Основний клас аплету:

Public class HalloWWW extends java.applet.Applet{
}

Аплет повинен містити основний клас, похідний від java.applet.Applet.
Батьківський клас Applet передає нашому класу низку стандартних методів, які можна перевизначити в аплеті та які виконуються віртуальною машиною, що викликається з браузера.
Замість java.applet.Applet можна використовувати javax.swing.JApplet.JApplet є аплетом та має перевагу в тому, що він може служити як контейнер для Swing-компонентів. Крім того, аплети JApplet можуть містити меню.
Метод paint()/
У applet-класі завжди немає методу main(). Це пов'язано з тим, що java-плагін, який запускає аплет, цей метод не потрібен. Замість нього він шукає інші методи та викликає їх у певному порядку, відомому як життєвий цикл аплету. Одним із цих методів є метод paint(), який автоматично викликається щоразу, якщо на сайті має зображуватись графічний інтерфейс аплету. Ми використовуємо цей факт, щоб вивести текст в аплеті:

public void paint(java.awt.Graphics gs) {
gs.drawString(“привіт, www!”, 100, 100);
}

Структура Java-аплетів включає основний клас, дочірній від класу java.applet.Applet та оголошений як public. Замість методу main() потрібно визначити в аплеті один або кілька з наступних методів, що викликаються автоматично: init(), start(), stop() та destroy().
Створення та запуск аплетів.
Для створення та запуску аплетів потрібно виконати ті ж кроки, що і для звичайного віконного додатку:
Створюємо в текстовому редакторі новий документ, набираємо в ньому вихідний текст аплету та зберігаємо з ім'ям Applet-класу.
Другим кроком буде компіляція вихідного аплету файлу:

>javac HalloWWW.java

Компілятор створює відповідний вихідний файл із розширенням class
Перед запуском для тестування аплету потрібно підготувати відповідну HTML-сторінку, з якої буде викликатися аплет.

Створення простої Web-сторінки

Аплети можуть “жити” лише всередині програми перегляду (браузері).
Підготуємо першу нашу Web-сторінку, з якої може завантажуватись наш перший аплет.

<html>
<head>
<title>Hallo applet</title>
</head>
<p>HTML викликає аплет </p>

<applet code = “HalloWWW.class”
Width = "350"
Height = "200" >
</applet>
</body>
</html>

Збережемо цей Html-код під назвою HalloApplet.

Тестування у програмі AppletViewer

Щоб створити сайт з аплетом та перевірити його, треба виконати такі дії:
1. За допомогою текстового редактора створіть новий текстовий файл та наберіть код, що вказаний зверху.
2. Збережіть файл під будь-яким ім'ям, але з розширенням html в тій же папці, де і розміщений Java-аплет.
3. Завантажте HTML-файл за допомогою програми AppletViewer

>appletviewer HalloApplet.html

Java. Тестування у програмі AppletViewer

Для правильного запуску аплету необхідно, щоб class-файл аплету називався так само, як зазначено в тегу <applet> і знаходитися в тій же папці. В іншому випадку потрібен спеціальний параметр у тегу <applet>, який вказує шлях до аплету:

<applet code="HalloWWW.class"
Codebase=”c:/java/work”
Width = "350"
Height = "200">
</applet>

Тут work – це папка, куди ми помістили наш class-файл.
Вихідний текст нашого аплету починається з рядка, що включає оператором import бібліотеку класів java.applet.Applet.
Оператор import повинен розташовуватись у файлі вихідного тексту перед іншими операторами (за винятком операторів коментаря). Як параметр оператору import передається ім'я класу, що підключається з бібліотеки класів. Якщо необхідно підключити всі класи цієї бібліотеки, замість імені класу вказується символ "*". Далі у вихідному тексті аплет визначається клас типу public з ім'ям HelloApplet. Це ім'я повинне обов'язково збігатися з ім'ям файлу, який містить вихідний текст цього класу.

Життєвий цикл аплету

Незалежно від того, чи Applet вказаний як безпосередній батьківський клас, Applet-клас успадковує 5 важливих методів: init(), start(), paint(), stop(), і destroy(). Кожен аплет володіє цими способами, т.к. програма перегляду, яка запускає аплет, викликає ці методи у різні періоди життєвого циклу аплету:
Init() викликається один раз після того, як програма перегляду завантажила аплет.
Start () викликається щоразу, якщо програма перегляду запускає аплет чи повертається до нього.
Paint () викликається при перемальовуванні аплету.
Stop () викликається, якщо програма перегляду зупиняє аплет.
Destroy () викликається 1 раз, перш ніж програма перегляду видалить аплет із оперативної пам'яті.
Методи аплету є абстрактними і їх треба переписувати. Але з їхньою допомогою можна змінити поведінку аплета.
Аплет, що малює кольорові кружки
Наш перший реальний аплет – це просто генератор кольорових кружечків, який має навчити нас як виконувати поділ функцій між методами init(), start(), paint(), stop() та destroy().
Отже, приступимо
Оголошення класу Applet

Import java.awt.*;
Import java.applet.*;
Public class Spot extends Applet {
Class Center {
Int m_x, m_y; //Центр кружечка
Int m_r; // Радіус кружечка
}
Center() m_safe;
Color m_fabre;

Спочатку ми оголошуємо в межах нашого Applet-класу внутрішній клас на ім'я Center, який просто служить для збереження центрів і радіусів окремих кружечків.
Потім ми оголошуємо масив m_safe, в якому зберігатимемо окремі кружечки (об'єкти класу Center), та змінну типу Color для запису в пам'ять кольору, який має бути однаковим у всіх кружечків.

Конструктор та метод init()

Public Spot() {
M_safe = new Center[7];
For(int I = 0; i < m_safe.Length; i++) {
m_safe[i] = new Center();
}
}
public void init() {
// Установка цветов
m_fabre = new Color ((int) (255*Math.random()),
(int) (255*Math.random()),
(int) (255*Math.random()) );
}

Конструктор Applet-класу та метод init() викликаються одноразово, коли аплет завантажується вперше. Обидва виконують свої дії щодо ініціалізації аплету: виділення пам'яті за допомогою оператора new, ініціалізацію змінних екземпляра, встановлення кольору, малюнків шрифту тощо.

Запуск апплета. Метод start()

Після методу init() програма перегляду викликає метод start().

Public void start() {

For (int i = 0; i < m_safe.length; i++) {
m_safe[i].m_x = (int) (400*Math.random());
m_safe[i].m_y = (int) (200*Math.random());
m_safe[i].m_r = (int) (50*Math.random());
}
}

Аплет запускається за допомогою методу start(). При цьому потрібно враховувати, що це відбувається щоразу, якщо відвідувач Web-сторінки по-новому завантажує її або повертається під час читання багатосторінкових документів на сторінку з аплетом.
Оскільки наш аплет не робить обчислень і не створює мультиплікацію, в методі start() задаємо координати та радіуси кружечків.

Відображення аплету. Метод paint()

 

Public void paint(Graphics g) {
g.setColor (m_fabre);
for (int i = 0; i < m_safe.length; i++) {
g.fillOval(m_safe[i].m_x,
m_safe[i].m_y,
m_safe[i].m_r,
m_safe[i].m_r,);
}
}
} // кінець Spot

Тут ми встановлюємо колір та виводимо кружечки.

Документ HTML

Створюємо html-документ, в якому запустимо наш аплет. 

<html>
<head>
<title>Генератор кружечків</title>
</head>

<body>
<h3>Web-сторінка для демонстрації генератора кружечків<h3>
<p> За бажанням можна побачити нижче вікна виведення Spot-аплету вихідний код для отримання кружка </p>
<hr>
<applet code="Spot.class" width="400", height="200"></applet>
<hr>
<a href=”Spot.java”>Початковий код аплету.</a>
</body>
</html>

Передача параметрів до аплет

Іноді бажано передати аплету, який вбудований в HTML-документ, певні параметри, наприклад, розміри аплету або якісь інші дані.
Для цього використовується тег <param>.
У HTML-тексті кожного параметра, який потрібно передати аплету, слід використовувати тег <param>:

<applet code="NewApplet.class"
Width = "400" height = "200">
<param name = "width" value = "400">
<param name = "height" value = "200">
</applet>

Кожен параметр складається з пари "ім'я/значення", що вказується в <param> за допомогою атрибутів name та value. Атрибут value служить для вказівки назви параметра, а value задає значення цього параметра.

Перетворення аплетів у додатки

Цілком ймовірно, що при пошуку у Всесвітній павутині ви зустрічали вже багато аплетів. При цьому в більшості випадків користувачі наштовхуються на більш менш ефективні аплети, основним завданням яких є привернення уваги до Web-сторінок. Такий аплет має право на існування, але істотна перевага аплетів полягає в тому, що за їх допомогою звичайні статичні Web-сторінки стають динамічними, що дозволяє значно розширити їх переваги і збільшити потенціал.
Для початку спробуємо продати найпростіший калькулятор. Написання свого калькулятора на Java допоможе краще розібратися із Swing. Перш ніж почати розробку своєї програми, ми повинні знати, що має містити в собі наш додаток.

Наш калькулятор складатиметься з дисплея, на якому відображатиметься поточна інформація та панелі з кнопками, частина з яких буде цифрами, а інша частина – операціями. Для цього потрібно використовувати клас Swing. Класи Swing містять різні елементи управління без прив'язки до конкретної операційної системи, через що їх визначають як "легковажні" компоненти. Фактично це означає, що код, який визначає вигляд та поведінку Swing-елементів, відноситься не до відповідної операційної системи, в якій виконується Java-програма, а до справжніх класів Java.

Для створення вікна програми Swing використовується клас JFrame. Він містить ряд методів та властивостей, які дозволяють налаштувати його належним чином.
Для того, щоб реалізувати те, що ми хочемо, нам необхідно розбити JFrame на 3 частини:

  1. Дисплей
  2. Кнопки
  3. Кнопка виконати

Для цього створимо клас CalcFrame, який успадковуватиметься від Jframe:

import javax.swing.*;
import java.awt.*;
public class CalcFrame extends JFrame {
CalcFrame() {
setBounds(300, 300, 300, 300);
setLayout(new BorderLayout());
setVisible(true);
}
public static void main(String[] args)
{
new CalcFrame();
}
}

Тепер наповнимо наше вікно вмістом:

JTextArea display= new JTextArea();//дисплей калькулятора
JPanel buttonPanel = new JPanel(new GridLayout(3,5));//панель з кнопками
JButton button0 = new JButton("0");//кнопка 0
JButton button1 = new JButton("1");//кнопка 1
JButton button2 = new JButton("2");//кнопка 2
JButton button3 = new JButton("3");//кнопка 3
JButton button4 = new JButton("4");//кнопка 4
JButton button5 = new JButton("5");//кнопка 5
JButton button6 = new JButton("6");//кнопка 6
JButton button7 = new JButton("7");//кнопка 7
JButton button8 = new JButton("8");//кнопка 8
JButton button9 = new JButton("9");//кнопка 9
JButton buttonSum = new JButton("+");//кнопка +
JButton buttonBack = new JButton("C");//кнопка С
JButton buttonDivide = new JButton("/");//кнопка /
JButton buttonSub = new JButton("-");//кнопка –
JButton buttonMul = new JButton("*");//кнопка *
JButton buttonStart = new JButton("=");//кнопка =

Розташуємо їх тепер у нашому вікні:

CalcFrame() {
setBounds(300, 300, 300, 300);
setLayout(new BorderLayout());
add(display,BorderLayout.NORTH);
add(buttonPanel,BorderLayout.CENTER);
add(buttonStart,BorderLayout.SOUTH);
buttonPanel.add(button0);
buttonPanel.add(button1);
buttonPanel.add(button2);
buttonPanel.add(button3);
buttonPanel.add(button4);
buttonPanel.add(button5);
buttonPanel.add(button6);
buttonPanel.add(button7);
buttonPanel.add(button8);
buttonPanel.add(button9);
buttonPanel.add(buttonSum);
buttonPanel.add(buttonSub);
buttonPanel.add(buttonMul);
buttonPanel.add(buttonBack);
buttonPanel.add(buttonDivide);
setVisible(true);
}

Реалізуємо обробник події "натискання на кнопку":

 

button0.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"0");
}
});
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"1");
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"2");
}
});
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"3");
}
});
button4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"4");
}
});
button5.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"5");
}
});
button6.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"6");
}
});
button7.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"7");
}
});
button8.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"8");
}
});
button9.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText()+"9");
}
});

Операція “C” видалятиме лише останню цифру на дисплеї, якщо такі є:

buttonBack.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String temp = display.getText();
display.setText(temp.substring(0,temp.length()-1));
}
});

Для реалізації інших операцій калькулятора додамо до нашого класу 2 поля: firstValue і operation:

int firstValue = 0;
tring operation = "+";

При виконанні операцій +, -, * та / ми повинні очистити екран і зберегти значення та операцію:

 

buttonSum.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = Integer.valueOf(display.getText());
display.setText("");
operation = "+";
}
});
buttonMul.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = Integer.valueOf(display.getText());
display.setText("");
operation = "*";
}
});
buttonDivide.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = Integer.valueOf(display.getText());
display.setText("");
operation = "/";
}
});
buttonSub.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
firstValue = Integer.valueOf(display.getText());
display.setText("");
 operation = "-";
}
});

Залишилося продати останню операцію “=”. При натисканні на цю кнопку калькулятор повинен вважати друге значення з дисплея та виконати вказану операцію та відобразити результат на екрані.

buttonStart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int secondValue = Integer.valueOf(display.getText());
if("+".equals(operation)){
display.setText((firstValue+secondValue)+"");
}
if("-".equals(operation)){
display.setText((firstValue-secondValue)+"");
}
if("*".equals(operation)){
display.setText((firstValue*secondValue)+"");
}
if("/".equals(operation)){
display.setText((firstValue/secondValue)+"");
}
firstValue = 0;
operation = "+";
}
});

От і все наш калькулятор буде мати вигляд:

створення калькулятора на

Практикуйте розробку додатків та веб сторінок на java і коду вам без багів!