Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java MKM.doc
Скачиваний:
0
Добавлен:
21.02.2020
Размер:
634.88 Кб
Скачать

43. Методы числовых классов

class number test{

Public static void main (string [] args){

Int i=0;

Short sh=0;

Doudle d=0;

Byte b=0;

Float f=0;

Long ln=0;

Integer k1=new Integer(55);

Double dl=new Double(3.14);

try{

  i = Integer.parselnt(args[0])

sh = Short.parseShort(args[0]);

d = Double.parseDouble(args[1]);

dl = new Double(args[1]);

kl = new Integer(args[0]);

 }catch(Exception e){}

double x = 1.0/0.0;

System.out.println("i = " + i) ;

System.outjprintln("sh - " + sh) ;

 System.out.println("d. = " + d) ;

 System.out.println("kl.intValue() = " + kl.intValue());

System.out.println("dl.intValue() '= "'+ dl.intValuei)); 

System.out.println("kl > k2? " + kl.compareTo(k2)); 

 System.out.println ("x = " + x);

System.out.println("x isNaN? " + Double.isNaN(x)); 

System.out.println("x islnfinite? " + Double.islnfinite(x)); 

 System.out.println("x == Infinity? " +

 (x == Double.POSITIVE_INFINITY) );

System.out.println("d = " + Double.doubleToLongBits(d)); 

    System.out.println("i = " + Integer.toBinaryString(i)); 

    System.out.println("i = " + Integer.toHexString(i)); 

    System.out.println("i = " + Integer.toOctalString(i)); 

  } 

}}}

44. Класс Class, BigInteger и BigDecimal

public static void main(String[] args) {

// create a BigDecimal object

BigDecimal bg1;

// create a BigInteger object

BigInteger i1;

bg1 = new BigDecimal("235.738");

// assign the BigInteger value of bg1 to i1

i1 = bg1.toBigInteger();

String str = "BigInteger value of " + bg1 + " is " + i1;

// print i1 value

System.out.println( str );

Класс:

Class box{

Double width;

Double hieght;

Double depth;

}

//этот класс объявляет объект типа Box.

Class BoxDemo{

Public statis void main (string args []){

Box mybox= new Box();

Double vol;

//присваивание значений переменными экземпляра mybox

Mybox.width=10;

Mybox.height=20;

Mybox.depth =15;

//вычисление объема параллепипеда

Vol= my box. Width*mybox.height*mybox.depth;

System.out.println(“объем равен” + vol);

}

}

45.

Классы-утилиты: работа с массивами, работа с датами и временем, получение случайных чисел, копирование с системой, взаимодействие с системой.

Работа с массивами

В классе Arrays из пакета java.utii собрано множество методов для работы с массивами. Их можно разделить на четыре группы.

Применение методов класса Arrays 

import java.utii.*;

class ArraysTest{

public static void main(String[] args){

int[] a = {34, -45, 12, 67, -24, 45, 36, -56};

Arrays.sort(a) ;

for (int i = 0; i < a.length; i++)

System.out.print (a[i]. + " "); 

System.out.println();

Arrays.fill(a, Arrays.binarySearch(a, 12), a.length, 0); 

for (int i = 6; i < a.length; i++)

  System.out.print(a[i] + " "); 

System.out.println(); 

 } 

}

Работа с датами и временем

Методы работы с датами и показаниями времени собраны в два класса: Calendar и Date из пакетаjava.utii.

Объект класса Date хранит число миллисекунд, прошедших с 1 января 1970 г. 00:00:00 по Гринвичу. Это "день рождения" UNIX, он называется "Epoch".

Получить текущее число миллисекунд, прошедших с момента Epoch на той машине, где выполняется программа, можно статическим методом

System.currentTimeMillis()

В классе Date два конструктора. Конструктор Date () заносит в создаваемый объект текущее время машины, на которой выполняется программа, по системным часам, а конструктор Date (long miiiisec)— указанное число.

Получить значение, хранящееся в объекте, можно методом long getTime (),

установить новое значение — методом setTimedong newTime).

Три логических метода сравнивают отсчеты времени:

boolean after (long when) — возвращает true, если время when больше данного;

boolean before (long when) — возвращает true, если время when меньше данного;

boolean after (Object when) — возвращает true, если when — объект класca Date и времена совпадают.

Еще два метода, сравнивая отсчеты времени, возвращают отрицательное число типа int, если данное время меньше аргумента when; нуль, если времена совпадают; положительное число, если данное время больше аргумента when:

int compareTo(Date when);

int compareTotobject when) — если when не относится к объектам класса Date, создается исключительная ситуация.

Преобразование миллисекунд, хранящихся в объектах класса Date, в текущее время и дату производится методами класса calendar.

System.out.println("LONG: " + DateFormat.getDateTimelnstance( 

DateFormat. LONG, DateFormat. LONG) . format (new Date ()•));

Получение случайных чисел

Получить случайное неотрицательное число, строго меньшее единицы, в виде типа double можно статическим методом random () ИЗ класса java.lang.Math.

Более серьезные действия со случайными числами можно организовать с помощью методов классаRandom из пакета java.utii. В классе два конструктора:

Random (long seed) — создает генератор псевдослучайных чисел, использующий для начала работы число seed; Random() —выбирает в качестве начального значения текущее время. ;

Создав генератор, можно получать случайные числа соответствующего типа методами nextBoolean(), nextDouble(), nextFloat()(, nextGau.ssian(), next into, nextLong(), nextint(int max) или записать сразу последовательность случайных чисел в заранее определенный массив байтов bytesметодом nextBytes(byte[] bytes).

Вещественные случайные числа равномерно располагаются в диапазоне от 0,0 включительно до 1,0 исключительно. Копирование массивов

В классе System из пакета java.iang есть статический метод копирования массивов, который использует сама исполняющая система Java. Этот метод действует быстро и надежно, его удобно применять в программах. Синтаксис:

static void arraycopy(Object src, int src_ind, Object dest, int dest_ind, int count)

Из массива, на который указывает ссылка src, копируется count элементов, начиная с элемента с индексом src_ind, в массив, на который указывает ссылка dest, начиная с его элемента с индексомdest_ind.

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

Ссылки src и dest могут совпадать, при этом для копирования создается промежуточный буфер. Метод можно использовать, например, для сдвига элементов в массиве. После выполнения

int[] arr = {5, 6, 1, 8, 9, 1, 2, 3, 4, 5, -3, -7}; 

System.arraycopy(arr, 2, arr, 1, arr.length — 2);

получим (5, 7, 8, 9, 1, 2, 3, 4, 5, -3, -7, -7}.

Взаимодействие с системой

Класс System позволяет осуществить и некоторое взаимодействие с системой во время выполнения программы (run time). Но кроме него для этого есть специальный класс Runtime.

Класс Runtime содержит некоторые методы взаимодействия с JVM во время выполнения программы. Каждое приложение может получить только один экземпляр данного класса статическим методомgetRuntime (}. Все вызовы этого метода возвращают ссылку на один и тот же объект.

Метод hait(int status) осуществляет немедленный останов JVM. Он не завершает запущенные процессы нормально и должен использоваться только в аварийных ситуациях.

46.

Классы-коллекции: класс Vector, класс Stack, класс Hashtable.

Класс Vector

В классе vector из пакета java.utii хранятся элементы типа object, а значит, любого типа. Количество элементов может быть любым и наперед не определяться. Элементы получают индексы О, 1, 2, .... К каждому элементу вектора можно обратиться по индексу, как и к элементу массива.

Кроме количества элементов, называемого размером (size) вектора, есть еще размер буфера — емкость (capacity) вектора. Обычно емкость совпадает с размером вектора, но можно ее увеличить методом ensureCapacity(int minCapacity) или сравнять с размером вектора методом trimToSize().

Vector v = new Vector();

String s = "Строка, которую мы хотим разобрать на слова.";

 StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");

 while (st.hasMoreTokens()){

   // Получаем слово и заносим в вектор

  v.add(st.nextToken());                                        // Добавляем в конец вектора 

}

System.out.println(v.firstElement());       // Первый элемент 

System.out.println(v.lastElement());        // Последний элемент

 v.setSize(4);                              // Уменьшаем число элементов 

v.add("собрать.");                          // Добавляем в конец

                                            // укороченного вектора

v.set(3, "опять");                          // Ставим в позицию 3 

for (int i = 0; i < v.sizeO; i++)         // Перебираем весь вектор

System.out.print(v.get(i) + " "); 

System.out.println();

Класс Stack

Класс stack из пакета java.utii. объединяет элементы в стек.

Стек (stack) реализует порядок работы с элементами подобно магазину винтовки— первым выстрелит патрон, положенный в магазин последним,— или подобно железнодорожному тупику — первым из тупика выйдет вагон, загнанный туда последним. Такой порядок обработки называется LIFO (Last In — First Out).

Перед работой создается пустой стек конструктором stack ().

Затем на стек кладутся и снимаются элементы, причем доступен только "верхний" элемент, тот, что положен на стек последним.

Проверка парности скобок 

import java.utii.*; 

class StackTesti

static boolean checkParity(String expression,

                    String open, String close){ 

   Stack stack = new Stack (); 

   StringTokenizer st = new StringTokenizer(expression,

                          " \t\n\r+*/-(){}", true);

   while (st..hasMoreTokens ()) {

     String tmp = st.nextToken();

     if (tmp.equals(open)) , stack.push(open);

           if (tmp.equals(close)) stack.pop(); 

     }

     if (stack.isEmpty () ) return true/return false; 

}

public static void main(String[] args){ 

  System.out.println(

          checkParityC'a - (b - (c - a) / (b + c) - 2) , "(", "))); 

 } 

}

Класс Hashtable

Класс Hashtable расширяет абстрактный класс Dictionary. В объектах этого класса хранятся пары "ключ — значение".

Из таких пар "Фамилия И. О. — номер" состоит, например, телефонный справочник.

Еще один пример — анкета. Ее можно представить как совокупность пар "Фамилия — Иванов", "Имя — Петр", "Отчество — Сидорович", "Год рождения — 1975" и т. д.

Подобных примеров можно привести множество.

Каждый объект класса Hashtable кроме размера (size) — количества пар, имеет еще две характеристики: емкость (capacity) — размер буфера, ипоказатель загруженности (load factor) — процент заполненности буфера, по достижении которого увеличивается его размер.

 Телефонный справочник 

import java.util.*;

class PhoneBook{

public static void main(String[] args){ 

Hashtabie yp = new Hashtabie();

 String name = null; 

yp.put("John", "123-45-67");

 yp.put ("Lemon", "567-34-12"); 

yp.put("Bill", "342-65-87"); 

yp.put("Gates", "423-83-49");

  yp.put("Batman", "532-25-08");

  try{

      name = args[0]; 

   (catch(Exception e){

      System.out.println("Usage: Java PhoneBook Name"); 

return;

 }

 if (yp.containsKey(name))

     System.out.println(name + "'s phone = " + yp.get(name)); 

 else

   System.out.println("Sorry, no such name"); 

 ) }

47.

Интерфейсы: Collection, List, Set, Iterator, ListIterator.

Интерфейс Collection

Интерфейс collection из пакета java.util описывает общие свойства коллекций List и set. Он содержит методы добавления и удаления элементов, проверки и преобразования элементов:

boolean add (Object obj) — добавляет элемент obj в конец коллекции; возвращает false, если такой элемент в коллекции уже есть, а коллекция не допускает повторяющиеся элементы; возвращает true, если добавление прошло удачно;

boolean addAii (Collection coll) — добавляет все элементы коллекцииcoll в конец данной коллекции;

void clear () — удаляет все элементы коллекции;

boolean contains (Object obj) — проверяет наличие элемента obj в коллекции;

boolean containsAii (Collection coll) — проверяет наличие всех элементов коллекции coll в данной коллекции;

boolean isEmpty() — проверяет, пуста ли коллекция;

iterator iterator () — возвращает итератор данной коллекции;

boolean remove (object obj) — удаляет указанный элемент из коллекции; возвращает false, если элемент не найден, true, если удаление прошло успешно;

boolean removeAii (Collection coil) — удаляет элементы указанной коллекции, лежащие в данной коллекции;

boolean retainAii (Collection coll) — удаляет все элементы данной коллекции, кроме элементов коллекции coll;

int size () — возвращает количество элементов в коллекции;

object [] toArray () — возвращает все элементы коллекции в виде массива;

Objectn toArray<object[] a) — записывает все элементы коллекции в массив а, если в нем достаточно места.

Интерфейс List

Интерфейс List из пакета java.utii, расширяющий интерфейсcollection, описывает методы работы с упорядоченными коллекциями. Иногда их называют последовательностями (sequence). Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу. В отличие от коллекции Set элементы коллекции List могут повторяться.

Класс vector — одна из реализаций интерфейса List.

Интерфейс List добавляет к методам интерфейса Collection методы, использующие индекс index элемента:

void add(int index, object obj) — вставляет элемент obj в позициюindex; старые элементы, начиная с позиции index, сдвигаются, их индексы увеличиваются на единицу;

boolean addAll(int index, Collection coll) — вставляет все элементыколлекции coil;

object get(int index) — возвращает элемент, находящийся в позицииindex;

int indexOf(Object obj) — возвращает индекс первого появления элемента obj в коллекции;

int lastindexOf (object obj) — возвращает индекс последнего появления элемента obj в коллекции;

Listiterator listiterator () — возвращает итератор коллекции;

Listiterator listiterator (int index) — возвращает итератор конца коллекции от позиции  index;

object set (int index, object obj) — заменяет элемент, находящийся в позиции index, элементом obj;

List subListUnt from, int to) — возвращает часть коллекции от позицииfrom включительно до позиции to исключительно.

Интерфейс Set

Интерфейс set из пакета java.utii, расширяющий интерфейс Collection, описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set). Такие коллекции удобны для проверки наличия или отсутствия у элемента свойства, определяющего множество. Новые методы в интерфейс Set не добавлены, просто метод add () не станет добавлять еще одну копию элемента, если такой элемент уже есть в множестве.

Этот интерфейс расширен интерфейсом sortedset.

Интерфейс Iterator

В интерфейсе iterator описаны всего три метода:

логический метод hasNext () возвращает true, если обход еще не завершен;

метод next о делает текущим следующий элемент коллекции и возвращает его в виде объекта класса object;

метод remove о удаляет текущий элемент коллекции.

 Использование итератора вектора 

Vector v = new Vector();

String s = "Строка, которую мы хотим разобрать на слова."; 

StringTokenizer st = new StringTokenizer(s, " \t\n\r,."); 

while (st.hasMoreTokens()){

     // Получаем слово и заносим в вектор.

     v.add(st.nextToken());                                 // Добавляем в конец вектора }

System.out.print*Ln(v.firstElement(});                      // Первый элемент 

System.out.println(v.lastElement());                        // Последний элемент 

v.setSize(4);                                               // Уменьшаем число элементов

  v.add("собрать.");                                         // Добавляем в конец укороченного вектора 

v.set(3, "опять");                                          // Ставим в позицию 3

for (int i = 0; i < v.sizeO; i++)                           // Перебираем весь вектор

System.out.print(v.get(i) + "."); 

System.out.println(};

Iterator it = v.iterator ();                                // Получаем итератор вектора 

try{

    while(it.hasNext())                                     // Пока в векторе есть элементы,

        System.out.println(it.next());           // выводим текущий элемент 

}catch(Exception e){}

Интерфейс  Listlterator

Интерфейс Listiterator расширяет интерфейс iterator, обеспечивая перемещение по коллекции как в прямом, так и в обратном направлении. Он может быть реализован только в тех коллекциях, в которых есть понятия следующего и предыдущего элемента и где элементы пронумерованы.

В интерфейс Listiterator добавлены следующие методы: void add (Object element), boolean hasPrevious (),int nextindex(),Object previous () , int previous index () , void set (Object element). выполняется сразу после next () или previous ().

Listiterator lit = v.listlterator();                       // Получаем итератор вектора

                 // Указатель сейчас находится перед началом вектора 

try{

   while(lit.hasNext())                                   // Пока в векторе есть элементы

      System.out.println(lit.next());                     // Переходим к следующему 

                                                          // элементу и выводим его

         // Теперь указатель за концом вектора. Пройдем к началу

while (lit. hasPrevious ()) 

       System, out. printlnf lit. p'reviblis ()); :

}catch (Exception e) {)}

48.

Работа с пакетами. Основные пакеты. Оператор импорта.

Пакеты — это контейнеры классов, которые используются для со­хранения изолированности пространства имен класса.

Оператор import

После оператора package, но до любого определения классов в исход­ном Java-файле, может присутствовать список операторов import. Паке­ты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора import такова:

import пакет1 [.пакет2].(имякласса|*);

Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необя­зательное имя пакета, вложенного в первый пакет и отделенное точкой. И, на­конец, после указания пути в иерархии пакетов, указывается либо имя класса, либо метасимвол звездочка. Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вмес­то имени класса. В приведенном ниже фрагменте кода показаны обе формы использования оператора import :

import java.util.Date

import java.io.*;

Все встроенные в Java классы, которые входят в комплект поставки, хранятся в пакете с именем java. Базовые функции языка хранятся во вложенном пакете java.lang. Весь этот пакет автоматически импортируется транслятором во все программы. Это эквивалентно размещению в начале каждой программы оператора

import java.lang.*;

Если в двух пакетах, подключаемых с помощью формы оператора im­port со звездочкой, есть классы с одинаковыми именами, однако вы их не используете, транслятор не отреагирует. А вот при попытке исполь­зовать такой класс, вы сразу получите сообщение об ошибке, и вам при­дется переписать операторы import, чтобы явно указать, класс какого пакета вы имеете ввиду.

class MyDate extends Java.util.Date { }

49.

Как создаются пакеты ?

Создание пакета является простой задачей: достаточно включить команду package в качестве первого оператора исходного файла Java. Любые классы, объявленные внут­ри этого файла, будут принадлежать указанному пакету. Оператор package определяет пространство имен, в котором хранятся классы. Если оператор package опущен, имена классов помещаются в используемый по умолчанию пакет без имени. Оператор package имеет следующую общую форму:

package пакет;

Пакет задает имя пакета. Например, показанный ниже оператор создает пакет MyPackage:

package MyPackage;

Для хранения пакетов система Java использует каталоги файловой системы. Напри­мер, файлы .class любых классов, объявленных в качестве составной части пакета MyPackage, должны храниться в каталоге MyPackage. Помните, что регистр символов имеет значение, а имя каталога должно в точности совпадать имени пакета.

Один и тот же оператор package может присутствовать в более чем одном файле. Этот оператор просто указывает пакет, к которому принадлежат классы, определенные в данном файле. Он не препятствует тому, чтобы другие классы в других файлах были частью этого же пакета. Большинство пакетов, используемых в реальных программах, распределено по множеству файлов.

Java позволяет создавать иерархию пакетов. Для этого применяется символ точки. Оператор многоуровневого пакета имеет следующую общую форму:

package пакет1[.пакет2[.пакет3}];

Иерархия пакетов должна быть отражена в файловой системе среды-разработки Java. Например, в среде Windows пакет, объявленный как:

package java.awt.image;

должен храниться в каталоге java\awt\image. Необходимо тщательно проверять пра­вильность выбора имен пакетов. Имя пакета нельзя изменить, не изменяя имя каталога, в котором хранятся классы.

50.

Что такое IDE ? Какие есть IDE кроме NetBeans ?

Интегри́рованная среда́ разрабо́тки, ИСР (англ. IDE, Integrated development environment) — система программных средств, используемая программистами для разработки программного обеспечения (ПО).

Обычно, среда разработки включает в себя:

текстовый редактор,

компилятор и/или интерпретатор,

средства автоматизации сборки,

отладчик.

Иногда содержит также средства для интеграции с системами управления версиями и разнообразные инструменты для упрощения конструирования графического интерфейса пользователя. Многие современные среды разработки также включают браузер классовинспектор объектов и диаграмму иерархии классов — для использования при объектно-ориентированной разработке ПО. Хотя и существуют ИСР, предназначенные для нескольких языков программирования — такие как EclipseEmbarcadero RAD StudioQt Creator, последние ерсии NetBeansXcode или Microsoft Visual Studio, но обычно ИСР предназначается для одного определённого языка программирования — как, например, Visual Basic,DelphiDev-C++.

Интегрированные среды разработки были созданы для того, чтобы максимизировать производительность программиста благодаря тесно связанным компонентам с простыми пользовательскими интерфейсами. Это позволяет разработчику сделать меньше действий для переключения различных режимов, в отличие от дискретных программ разработки. Цель среды разработки заключается в том, чтобы абстрагировать конфигурацию, необходимую, чтобы объединить утилиты командной строки в одном модуле, который позволит уменьшить время, чтобы изучить язык, и повысить производительность разработчика. Например, ИСР позволяет проанализировать код и тем самым обеспечить мгновенную обратную связь и уведомить о синтаксических ошибках. В то время, как большинство современных ИСР являются графическими, они использовались ещё до того, как появились системы управления окнами (которые реализованы в Microsoft Windows или X11 для *nix-систем). Они были основаны на тексте, используя функциональные клавиши или горячие клавиши, чтобы выполнить различные задачи (например, Turbo Pascal). Использование ИСР для разработки программного обеспечения является прямой противоположностью способа, в котором используются несвязанные инструменты, такие как vi (текстовый редактор), GCC (компилятор), и т. п.

61.

Методы класса Graphics (задание цветов, рисование чертежей, работа с многоугольниками, вывод текста, установка и задание шрифта), класс FontMetrics. Классы Graphics нужны для работы с графическим контекстом. public void paint(Graphics g); этот метод наследуется из класса Component. Аргумент Graphics g создаётся системой, а мы берём его в готовом виде и используем для рисования. При создании элемента метод paint будет вызван автоматически. Задание цветов: Метод setColor класса Graphics сделает текущим новый цвет: // Запоминаем исходный цвет; Color oldColor = g.getColor(); // Создаём синий цвет; Color newColor = new Color(0, 0, 255); // Устанавливаем синий цвет; g.setColor(newColor); // Чертим линию синим цветом; g.drawLine(20, 30, 360, 30); // Восстанавливаем исходный цвет; g.setColor(oldColor);

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

Чисто красный цвет: Color newColor = new Color(255, 0, 0);

Чисто зеленый цвет: Color newColor = new Color(0, 255, 0);

Значения составляющих цвета изменяются от 0 до 255.

Рисование чертежей: Основной метод рисования: g.drawLine(20, 30, 360, 30); здесь 20, 30 — это координаты x, y начала линии, 360, 30 — координаты конца линии. работа с многоугольниками: Методом drawPolygon класса Graphics: int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50}; int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190}; Polygon poly = new Polygon(arrayX, arrayY, 8); g.drawPolygon(poly);

Здесь создаём объект класса Polygon. arrayX — это х-координаты вершин многоугольника, arrayY — это y-координаты вершин многоугольника, 8 — число вершин многоугольника.

вывод текста, установка и задание шрифта: Для этого используем класс Font: Font font = new Font("Tahoma", Font.BOLD|Font.ITALIC, 40); "Tahoma"-название шрифта, Font.BOLD|Font.ITALIC-жирный шртфт, 40-высота шрифта. После задания шрифта мы делаем его текущим и выводим строку этим шрифтом: g.setFont(font);  g.drawString("SBP", 270, 220);

Класс FontMetrics

FontMetrics класс определяет объект метрик шрифта, который инкапсулирует информацию о рендеринге определенного шрифта на определенном экране. Чтобы узнать размер определенной строки определенного шрифта в Java есть специальный классFontMetrics, который хранит подобную информацию и позволяет вычислить требуемые размеры. Как же получить ссылку на FontMetrics.

К примеру, нам необходимо получить FontMetrics компонента JLabel, для которого хотим сделать добавление многоточия при слишком длинном тексте. Сделать это можно вот так:

JLabel label = new JLabel("Test label");

Graphics g = label.getGraphics();

FontMetrics fm = g.getFontMetrics();

Сначала получается ссылка на Graphics, на котором рисуется сам JLabel, а затем из него при помощи метода getFontMetrics получается ссылка на FontMetrics.

62.

Возможности Java 2D (работа с координатной системой, графикой).

В систему пакетов и классов Java 2D, основа которой— класс Graphics2D пакета java.awt, внесено несколько принципиально новых положений.

Кроме координатной системы, принятой в классе Graphics и названной координатным пространством пользователя (User Space), введена еще система координат устройства вывода (Device Space): экрана монитора, принтера. Методы класса Graphics2D автоматически переводят (transform) систему координат пользователя в систему координат устройства при выводе графики

Графические примитивы: прямоугольник, овал, дуга и др., реализуют теперь новый интерфейс shape пакета java.awt. Для их вычерчивания можно использовать новый единый для всех фигур метод drawo, аргументом которого способен служить любой объект, реализовавший интерфейс shape. Введен метод fill о, заполняющий фигуры— объекты класса, реализовавшего интерфейс shape. Для вычерчивания (stroke) линий введено понятие пера (реп). Свойства пера описывает интерфейс stroke. Класс Basicstroke реализует этот интерфейс. Перо обладает четырьмя характеристиками:

оно имеет толщину (width) в один или несколько пикселов;

оно может закончить линию (end cap) закруглением — статическая константа CAP_ROUND, прямым обрезом — CAP_SQUARE (по умолчанию), или не фиксировать определенный способ окончания — CAP_BUTT;

оно может сопрягать линии (line joins) закруглением — статическая константа JOIN_ROOND, отрезком прямой — JOIN_BEVEL, или просто состыковывать — JOIN_MITER (по умолчанию);

оно может чертить линию различными пунктирами (dash) и штрих-пунктирами, длины штрихов и промежутков задаются в массиве, элементы массива с четными индексами задают длину штриха, с нечетными индексами — длину промежутка между штрихами.

63.

Основы апплетов. Архитектура и скелетная схема апплета

Аплеты являются подклассом классаApplet. Все они импортируют пакет java.applet, а также java.awt, который обеспечивает поддержку интерфейса аплета. Аплеты запускаются броузером Web, поддерживающим Java, или программой просмотра аплета. Вывод информации в окне аплета различных методов AWT, таких как drawString(),который выводит строку в заданной позиции экрана. После компиляции аплет включается в файл HTML с помощью дескриптора APPLET. Броузер начнет выполнение аплета при обнаружении его в файле HTML. Апплет должен быть подклассом java.applet.Applet class. Appletclass обеспечивает стандартный интерфейс между апплетом и средой браузера. Swing обеспечивает специальный подкласс Applet class вызывают javax.swing.JApplet. JApplet class должен использоваться для всех апплетов, которые используют компоненты Swing, чтобы создать их графические интерфейсы пользователя (GUI).

Архитектура аплетов С Плагином Java апплеты не выполняются в JVM в браузере. Вместо этого они выполняются в отдельном процессе. Существующие API были повторно спроектированы, чтобы использовать сокеты процесса, таким образом, вещи продолжают работать, как они сделали прежде, только лучше. Эта архитектура предоставляет много преимуществ:

1)Апплеты, которые требуют различных версий JRE, могут работать одновременно. 

2)Апплеты могут определить параметры запуска JRE, такие как размер "кучи".

3)Интерфейсы передачи сообщений пишутся в Java, таким образом, они работают на всех поддерживаемых платформах, таким же образом, таким образом, совместимость перекрестного браузера улучшается.

С той архитектурой может быть запущен новый JRE всякий раз, когда это необходимо. Но апплет будет работать в существующем JRE пока: a)Версия JRE, требуемая апплетом, соответствует существующий JRE, b)Параметры запуска JRE удовлетворяют требования апплета. скелетная схема апплета Все апплеты, кроме наиболее тривиальных, переопределяют набор методов, обеспечивающих основной механизм, с помощью которого браузер или программа просмотра взаимодействует с апплетом и управляет его выполне­нием. Четыре таких метода — inito, start о, stop о и destroy () — опре­делены в Applet. Пятый, paint о, определен AWT-классом component. Все пять методов можно собрать в следующую скелетную схему:  // Скелетная схема (скелет)апплета. import java.awt.*; import java.applet.*; public class AppletSkel extends Applet { // Вызывается первым, public void init()   { // инициализация  }  /* Вызывается вторым, после init().  */ public void start()   {  // начало или продолжение выполнения  } } /* Вызывается, когда апплет завершается.  Это — последний выполняемый метод. */

public void destroy(){ // выполняет завершающие действия  }  // Вызывается, когда окно апплета должно быть перерисовано, public void paint(Graphics g)  {  // повторный показ содержимого окна 

}

64

Основные методы апплетов.

Все апплеты переопределяют методы. Четыре из этих методов ­ init () , start () , pain t (), stop () и destroy () ­ применимы ко всем апплетам; они определены в классе App1et.

init () Этот метод вызывается первым. В нем обычно инициализируются переменные, определяются шрифты, файлы изображений, звуковые файлы и т. д. Данный метод выполняется только один раз, при загрузке апплета.

start () Этот метод вызывается после метода init() а также для перезапуска апплета после его приостановки. Задачей метода является запуск апплета. Он вызывается всякий раз, когда документ HTML данного апплета отображается на экране.

pain t () вызывается каждый раз, коrда B­BOД аплета должен быть перерисован. Эта ситуация возникает в нескольких случаях. Например, окно, в котором выполняется аплет, может быть перекрыто друrим окном, а затем вновь открыто. Или же окно аплета может быть минимизировано, а затем восстаН()Влено. Метод paint () также вызывается, коrда аплет начинает выполнение. В любом случае всякий раз, коrда нужно перерисовать аплет, вызывается ero метод paint (). Метод paint () принимает один параметр типа Graphics. Этот параметр будет содержать rpафический контекст, описывающий rpафи­ ческую среду, в которой выполняется аплет. Этот контекст используется всякий раз, KO­ rда запрашивается вывод аплета.

stop () Метод вызывается в том случае, когда браузер переходит на чтение другой страницы. Метод вызывается для приостановки работы апплета, который не виден на экране. Если браузер вернется к этой странице, то апплет запустится снова при помощи метода start() .

destroy () ­ Метод вызывается при необходимости полностью удалить апплет из памяти. Здесь необходимо освободить все ресурсы, используемые апплетом. Перед вызовом данного метода всегда вызывается метод stop() .

Эти 4 методов могут быть собраны в "скелет", показанный ниже.

import java.awt.*; import java,applet.*; public class AppletSkel extends Applet public void init() { } public void start() { } public void paint () { } public void stop() { } public void destroy() { }}

65.

Методы paint() и repaint() апплетов

pain t () вызывается каждый раз, коrда B­BOД аплета должен быть перерисован. Эта ситуация возникает в нескольких случаях. Например, окно, в котором выполняется аплет, может быть перекрыто друrим окном, а затем вновь открыто. Или же окно аплета может быть минимизировано, а затем восстаН()Влено. Метод paint () также вызывается, коrда аплет начинает выполнение. В любом случае всякий раз, коrда нужно перерисовать аплет, вызывается ero метод paint (). Метод paint () принимает один параметр типа Graphics. Этот параметр будет содержать rpафический контекст, описывающий rpафи­ ческую среду, в которой выполняется аплет. Этот контекст используется всякий раз, KO­ rда запрашивается вывод аплета.

Метод repaint () определен в АWт. Он заставляет исполняющую систему AWT ocy­ществлять вызов метода upda te () вашеrо аплета, который в реализации по умолчанию обращается к paint (). Таким образом, для Toro, чтобы друrая часть вашеrо аплета моrла выполнять вывод в ero окно, просто сохраните вывод и вызовите repaint (). Затем AWT выполнит вызов метода paint ( ) , который может отобразить сохраненную информацию. Например, если часть вашеrо аплета нуждается в выводе строки, она может сохранить ее в переменной String и затем вызвать repa.int () . Внутри paint () вы выведите строку с помощью drawString () .

Метод repaint () имеет четыре формы.

void repaint(int left, int top, int width, int height) Здесь координаты правоrо BepxHero уrла области указаны в left и top, а ширина и высота области ­ в width и height. Эти измерения указаны в пикселях. Вы экономите время, указывая область для перерисовки. Обновление окон обходится дороrо в смысле затрат времени. Если вам нужно обновить только небольшую часть окна, то более эффек­ тивно будет обновить только эту область, а не всю поверхность окна. Вызов repaint () ­ это, по сути, запрос вашеrо аплета на скорейшее обновление. Однако если ваша система медленна или занята, update () может и не вызваться HeMeд­ ленно. Множественные запросы на перерисовку, которые поступают за краткий период времени, MOryT быть слиты вместе AWT, так что upda te () вызывается лишь время от времени. Во мноrих ситуациях это может представлять проблему, включая вывод ани­мации, коrда существенно время обновления. Одним из решений этой проблемы может быть использование следующих форм repaint () : void repaint(long тaxDelay)

void repaint(long тaxDelay, int х, int у, int width, int height) ­Здесь тaxDelay указывает максимальное количество миллисекунд, которые MOryT пройти до Toro, как будет вызван update (). Однако следует иметь в виду, что если Bpe­мя истечет прежде, чем системе удастся вызвать update () , этот метод не будет вызван.

66.

Какие пакеты необходимы для использования апплетов ?

Пакет java.applet Обеспечивает классы, необходимые, чтобы создать апплет и классы, которые апплет использует, чтобы связаться с его контекстом апплета.

 Работа с апплетами поддерживается пакетом AWT. Пакет AWT содержит многочисленные классы и методы, которые позволяют создавать окна апплетов и управлять ими. Рассмотрим более подробно структуру данного пакета:

import java.applet.*;

import java.awt.*;

Импортирование пакетов java.awt.* необходимо в нашем примере, т.к. они содержат класс Graphics.

67.

Вывод на консоль. Обработка событий.

Консольный вывод проще Bcero осуществлять с помощью методов print () и print1n ().Эти методы определены в классе PrintStream (который является типом объекта System. out). Он также реализует низкоуровневый метод write (). То есть write () может применяться для записи на консоль. Простейшая форма wri te (), определенноro в PrintStream, по­казана ниже:

­void write (int byteval)

Для реальных проrpамм рекомендуемым способом записи на консоль при использовании java является поток PrintWriter. PrintWri er ­ это один из классов, основанных на символах. PrintWriter определяет несколько конструкторов. Один из тех, которые мы будем использовать, показан ниже:

PrintWriter(OutputStream outputStream, boolean flushOnNewline)

Здесь outputStreaт ­ объект типа OutputStream, а flushOпNewliпe управляет тем, будет ли java сбрасывать буфер в выходной поток каждый раз при вызове метода print1n ().PrintWriter поддерживаетм:етоды pri­t () и print+­ О,длЯ, B<iex т­пов, вклю­ Obj ect. Чтобы писать на консоль с помощью PrintWriter, специфицируйте System. out в качестве. выходноrо потока и сбрасывайте поток после каждоrо символа новой строки. Например, следующая строка кода создает PrintWriter, который подключен к консоль­НОМУ выводу:

­PrintWriter pw ­ new PrintWriter(System.out, true);

Хотя вывод в окно аплета должен осуществляться методами rpафическоrо интерфей­ са пользователя, такими как drawString () , аплеты также MOryT использовать консоль­ ный вывод ­ В частности, для отладочных целей. Коrда в аплете вызывается метод вроде System. out .print1n (), ero вывод не посылается в окно аплета. Вместо этоrо вывод по­ является либо в сеансе консоли, из которой вы запустили средство просмотра аплета, либо в консоли java, которая доступна в некоторых браузерах.

Обработка событии

События поддерживаются множеством пакетов, включая java.uti1, java.awt и java.event.

Каждый тип события имеет собственный метод реrистрации. Вот ero общая форма:

pиblic void addTypeListener(TypeListener el)

Здесь Туре ­ имя события, а е­l ссылка на слушатель событий. Например, метод, реrистрируЮщий слушатель событий клавиатуры, называется addKeyListener (), а Me­тод, реrистрирующий слушатель движения мыши ­ addМouseMotionListener ().

Некоторые источники допускают реrистрацию только одноrо слушателя. Общая фор­ма TaKoro метода показана ниже.

pиblic void addTypeListener(TypeListener el)

­hrows java.иtil.TooManyListenersException

называется индивидуалыюй рассылкой события,

68.AWT классы. Основы оконной графики.AWT определяет окна согласно иерархии классов.Таблица. Классы пакета AWT

Класс

Описание

BorderLayout

Диспетчер компоновки страниц. Границы устанавливаются с помощью North, South, East,West, Center

Button

Кнопка

Canvas

Чистое окно

CardLayout

Диспетчер компоновки с помощью вкладок. В каждый момент времени отображается лишь верхняя вкладка

CheckBox

Флажок

CheckboxGroup

Группа флажков

CheckboxMenuItem

Помечаемый пункт меню

Choice

Всплывающий список

Color

Управление цветами, не зависящими от платформы

Component

Абстрактный суперкласс для компонентов AWT

Container

Абстрактный подкласс класса Component, который может содержать другие компоненты

Dialogue

Диалоговое окно

Dimention

Задание размеров объекта. Ширина - width, высота - height

Event

Событие

FileDialogue

Окно выбора файла

FlowLayout

Диспетчер компоновки для последовательного размещения компонентов слева направо и сверху вниз

Font

Шрифт

FontMetrics

Инкапсулирование информации, связанной со шрифтом

Frame

Стандартное окно со строкой заголовка, меню и возможностью изменения размеров

Graphics

Инкапсулирование графического контекста

GridBagConstrains

Определение различных ограничений на GridBagLayout

GridBagLayout

Диспетчер компоновки для табличного размещения, который отображает компоненты

Image

Графическое изображение

Insets

Инкапсулирует границы контейнера

Label

Метка для вывода строки текста на экран

List

Список, в котором пользователь может выбирать нужный элемент (аналогично Windows)

MediaTracker

Управление мультимедиа-объектами

Menu

Меню

MenuBar

Полоса меню

MenuComponent

Абстрактный класс, реализуемый различными классами меню

MenuItem

Пункт меню

Panel

Простейший подкласс Component

Point

Декартовы координаты, хранящиеся в xy

Polygon

Многоугольник

Rectangle

Прямоугольник

ScrollBar

Полоса прокрутки

TextArea

Область ввода текста

TextComponent

Суперкласс для TextArea и TextField

TextField

Строка ввода

Toolkit

Абстрактный класс, реализуемый AWT

Window

Окно без рамки, меню и заголовка

Для поддержки пользовательских интерфейсов язык Java содержит библиотеки классов, позволяющие создавать и поддерживать окна, использовать элементы управления (кнопки, меню, полосы прокрутки и др.), применять инструменты для создания графических приложений. Графические инструменты и интерфейсы пользователя в языке Java реализованы с помощью двух библиотек: Пакет AWT (загружается java.awt) содержит набор классов, позволяющих выполнять графические операции и создавать элементы управления. Этот пакет поддерживается последующими версиями языка, однако считается весьма ограниченным и недостаточно эффективным.

69.

Swing система.Swing API — это набор классов, который обеспечивает более мощные и гиб­кие компоненты, чем AWT. В дополнение к знакомым компонентам типа кнопок, флажков и меток Swing поставляет несколько интересных добавле­ний, включая панели со вкладками, панели с прокруткой, деревья и табли­цы. Даже знакомые компоненты, такие как кнопки, имеют в Swing больше возможностей. Например, с кнопкой можно связать как изображение, так и текстовую строку. Кроме того, изображение может изменяться, когда изме­няется состояние кнопки.  В отличие от AWT-компонентов, Swing-компоненты не реализованы специ­фическим для платформы кодом. Вместо этого они написаны полностью на Java и, поэтому, платформно-независимы. Для описания таких элементов используется термин облегченный (lightweight).  Число классов и интерфейсов в пакетах Swing достаточно велико, так что в текущей главе приводится краткий обзор только некоторых из них. 

Классы Swing-компонентов : Класс  Описание  AbstractButton  ButtonGroup  Абстрактный суперкласс для кнопок Swing Инкапсулирует взаимоисключающий набор кнопок  ImageIcon  Инкапсулирует значок  Класс    Описание        JApplet    Swing-версия класса Applet        JButton    Класс Swing-кнопок        JCheckBox    Класс Swing-флажков   

JComboBox    Инкапсулирует combobox (комбинация раскрывающегося            списка и текстового поля)        JLabel    Swing-версия метки        JRadioButton    Swing-версия переключателей        JScrollPane    Инкапсулирует прокручиваемую панель        JTabbedPane    Инкапсулирует панели с вкладками        JTable    Инкапсулирует таблицы или сетки        JTextField    Swing-версия текстового поля        JTree    Инкапсулирует деревья  

Относящиеся к Swing классы содержатся в пакете javax.swing и его подпа-кетах, таких как javax.swing.tree1. Существует много других Swing-классов и интерфейсов, которые в данной главе не рассматриваются. Здесь мы раз­берем лишь некоторые Swing-компоненты и проиллюстрируем их на приме­рах апплетов.

70.

AWT иSwing

Библиотеки AWT и Swing поддерживает следующие основные элементы управления:

Текстовые метки

Кнопки

Флажки

«Радиопереключатели»

Списки

Поля со списком

Текстовые поля

Текстовые области

Панели прокрутки

Панели с вкладками

Деревья

Таблицы

Все элементы управления реализованы как объекты специальных классов, являющихся подклассами класса Component. Как уже говорилось ранее, каждый компонент (в т.ч. элемент управления) должен быть включен в некоторый контейнер (подкласс класса Container). В библиотеке AWT таким контейнером является само окно. Для добавления элемента управления к окну необходимо использовать одну из форм метода add( ), определенного в классе Container. Самая простая форма выглядит следующим образом:Componentadd(Componentobj)

Здесь obj – экземпляр элемента управления, который добавляется к окну. Метод возвращает ссылку на объект, который передается параметром obj. Сразу после добавления элемент будет выводиться на экран автоматически, когда отображается его «родительское» окно.

Удаление элемента управления из окна производится методом

voidremove (Componentobj).

Вызывая метод removeAll() можно удалить сразу все присоединенные к окну элементы управления.

Управлять положением элемента управления относительно окна, в котором он размещен, можно с помощью методов setBounds( ) и getBounds( ). Форматэтихметодов:voidsetBounds(int x, int y, int width, int height)

voidsetBounds(Rectangle r)

Rectangle getBounds()

В компоненте хранятся координаты его левого верхнего угла в системе координат «родительского» окна. Узнать их можно с помощью метода: PointgetLocation()

а изменить с помощью методов: voidsetLocation(int x, int y) voidsetLocation(Pointp)

Все элементы управления, за исключением текстовых меток, могут взаимодействовать с пользователем, генерируя некоторые события, которые в программе можно идентифицировать и обрабатывать. Модель обработки событий, реализованная в языке Java, будет рассматриваться ниже.

В библиотеке Swing компоненты перед выводом на экран должны быть помещены не в окно, а внутрь специального контейнера, который называется панель содержания (contentpane). Этот контейнер не нужно создавать, его можно получить для окна подобно графическому контексту:JFrame f = new JFrame("Test");Containercp = f.getContentPane();

После этого все операции добавления/удаления компонентов выполняются для панелисодержания, а не для самого окна.

71.

AWT менеджер компоновки.

AWT поддерживает следующие типы элементов управления:  Текстовые метки (Labels)  Кнопки (Push buttons)  Флажки (Check boxes)  Списки с выбором элементов (Choice lists)  Списки (Lists)  Полосы прокрутки (Scroll bars)  Элементы редактирования текста: текстовые поля (Text fields) и тексто­вые области (Text areas).  Элементы управления представлены специальными классами пакета AWT, которые являются подклассами1 класса component.

Добавление и удаление элементов управления  Для включения элемента управления в окно нужно добавить его к окну. Для этого необходимо сначала создать экземпляр желательного элемента управ­ления и затем добавить его к окну вызовом метода add (), который опреде­лен в классе Container. Метод add () имеет несколько форм. В первой части этой главы используется следующая форма:  Component add(Component aompObj) Текстовые метки  Самый простой для использования элемент управления — (текстовая) метка (label). Текстовая метка — это объект класса Label, содержащий строку, которую она отображает. Метки — пассивные элементы управления, кото­рые не поддерживают никакого взаимодействия с пользователем. Класс Label определяет следующие конструкторы:  Label ()  Label (String str)  Label (String str, int how)  Первая версия создает пустую метку, вторая — метку, которая содержит строку, специфицированную параметром str. Эта строка выровнена по ле­вому краю. Третья версия создает метку, которая содержит строку, специ­фицированную параметром str, используя выравнивание, указанное в пара­метре how. Значением how должна быть одна из трех констант: Label. left,  Label.RIGHT ИЛИ Label.CENTER.

72

. Работа в сети. Работа с сокетами в Java.Сокеты (сетевые разъёмы) – это логическое понятие, соответствующее разъёмам, к которым подключены сетевые компьютеры и через которые осуществляяется двунаправленная поточная передача данных между компьютерами. Сокет определяется номером порта и IP-адресом. При этом IP-адрес используется для идентификации компьютера, номер порта – для идентификации процесса, работающего на компьютере. Когда одно приложение знает сокет другого, создается сокетноепротоколо-ориентированное соединение по протоколу TCP/IP. Клиент пытается соединиться с сервером, инициализируя сокетное соединение. Сервер прослушивает сообщение и ждет, пока клиент не свяжется с ним. Первое сообщение, посылаемое клиентом на сервер, содержит сокет клиента. Сервер, в свою очередь, создает сокет, который будет использоваться для связи с клиентом, и посылает его клиенту с первым сообщением. После этого устанавливается коммуникационное соединение.

Сокетное соединение с сервером создается клиентом с помощью объекта классаSocket. При этом указывается IP-адрес сервера и номер порта. Если указано символьное имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу. Например, если сервер установлен на этом же компьютере, соединение с сервером можно установить из приложения клиента с помощью инструкции:Socket socket = new Socket("ИМЯ_СЕРВЕРА", 8030);Сервер ожидает сообщения клиента и должен быть заранее запущен с указанием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью методаaccept()класса ServerSocket, который возвращает сокет клиента:ServerSocket server = new ServerSocket(8030);Socket socket = server.accept();Таким образом, для установки необходимо установить IP-адрес и номер порта сервера, IP-адрес и номер порта клиента. Обычно порт клиента и сервера устанавливаются одинаковыми. Клиент и сервер после установления сокетного соединения могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или кPrintStream для того, чтобы программа могла трактовать поток как выходные файлы.В следующем примере для отправки клиенту строки "привет!" сервер вызывает метод getOutputStream() класса Socket. Клиент получает данные от сервера с помощью метода getInputStream(). Для разъединения клиента и сервера после завершения работы сокет закрывается с помощью метода close() класса Socket. В данном примере сервер отправляет клиенту строку "привет!", после чего разрывает связь.

73.

Работа в сети. Дейтаграммы.Конечно, для того, чтобы передать данные с одной машины на другую необходимо убедиться, что вы подсоединились к определенной машине в сети. Ранние варианты сетей были удовлетворены предоставлением уникальных имен машинам внутри локальной сети. Однако, Java работает в пределах Internet, что требует способа для уникальной идентификации машины из любой точки всего мира. Это выполняется с помощью IP (InternetProtocol) адреса, который может существовать в двух формах:1.Привычнаяформа DNS (Domain Name System). Мое доменное имя - bruceeckel.com;2.Альтернативный вариант: вы можете использовать форму из четырех чисел, разделенных точками, например 123.255.28.120.В обоих случаях IP адрес представляется как 32-х битное число [1] и вы можете получить специальный Java объект для представления этого числа из любой из перечисленных выше форм, используя статический метод InetAddress.getByName( ), который определен в java.net. Результатом будет объект типа InetAddress, который вы можете использовать для создания "сокета", как вы это увидите.

//: c15:WhoAmI.java // Нахождение вашего сетевого адреса, когда // вы соединены с Internet'ом. // {Запускается руками} Должно быть установлено соединение с Internet // {Args: www.google.com} import java.net.*; publicclass WhoAmI {    publicstatic void main(String[] args) throws Exception {       if (args.length != 1) {          System.err.println("Usage: WhoAmIMachineName");          System.exit(1);       }       InetAddress a = InetAddress.getByName(args[0]);       System.out.println(a);    } } // /:~ДейтаграммыДейтаграммы, или пакеты протокола UDP (User DatagramProtocol) — это пакеты информации, пересылаемые в сети по принципу “fire-and-forget” (выстрелил и забыл). Если вам надо добиться оптимальной производительности, и вы в состоянии минимизировать затраты на проверку целостности информации, пакеты UDP могут оказаться весьма полезными. UDP не предусматривает проверок и подтверждений при передаче информации. При передаче пакета UDP по какому-либо адресу нет никакой гарантии того, что он будет принят, и даже того, что по этому адресу вообще есть кому принимать такие пакеты. Аналогично, когда вы получаете дейтаграмму, у вас нет никаких гарантий, что она не была повреждена в пути или что ее отправитель все еще ждет от вас подтверждения ее получения. Java реализует дейтаграммы на базе протокола UDP, используя для этого два класса. Объекты класса DatagramPacket представляют собой контейнеры с данными, a DatagramSocket — это механизм, используемый при передаче и получении объектов DatagramPacket.

74.

Работа с фреймовыми окнами. Создание фрейм окна в апплетах.Иерархия классов

Container

Window — окно верхнего уровня. Нет рамок, строк заголовка, располагается на рабочем столе.

Frame — Окно с рамкой. Появляется строка меню, заголовок, статусбар, углы, изменяющие размер окна.

JFrame.

Dialog

FileDialog

JDialog

JWindow

// Пример апплета, создающего дополнительное окно

importjava.awt.*;

importjava.awt.event.*;

importjava.applet.*;

// Определим наш собственный класс окна

classDemoFrameextendsFrame {

DemoFrame(Stringtitle) {

// Окно будет иметь заголовок

super(title);

}

}

// Основной класс апплета

publicclassAppletFrameDemoextends Applet{

DemoFrame frame; // ссылканаокно

publicvoidinit(){

// Создадимэкземплярнашегоклассаокна

frame = newDemoFrame("My Frame");

// Добавим код для корректного закрытия окна,

// воспользовавшись анонимным классом

// вызывает нужные методы у адаптера при соответствующих событиях

frame.addWindowListener(

// содержит все возможные события и имплементирует все инетрфейсы

newWindowAdapter(){

publicvoidwindowClosing(WindowEvent e){

e.getWindow().dispose();

System.exit(0);

}

}

);

// Установим геометрические размеры окна

// в пикселях относительно всего экрана

// Отступ слева = 100

// Отступ сверху = 100

// Ширина окна = 200

// Высота окна = 200

frame.setBounds(100, 100, 200, 200);

}

publicvoidstart(){

// При старте апплета покажем окно на экране

frame.show();

}

publicvoid stop(){

// Во время остановки апплета уберем окно с экрана

frame.hide();

}

publicvoid destroy(){

// При завершении работы апплета очистим класс окна

frame.dispose();

}

}

75.

Оконные приложения.Для создания оконных приложений удобнее всего использовать класс Frame. В иерархии классов он выглядит следующим образом:

java.lang.Object

+----java.awt.Component

+----java.awt.Container

+----java.awt.Window

+----java.awt.Frame

По своей природе этот класс похож на классы Applet и Panel. В объекте класса Frame можно размещать элементы управления. Класс, производный от Frame, может раскрывать интерфейсы ActionListener и ItemListener.  Простейшее оконное приложение имеет вид: importjava.awt.event.*;

importjava.awt.*;

classsimpleFrame extends Frame

{

public static void main(String[] args)

{

simpleFrame a= new simpleFrame("Оконноеприложение");

}

simpleFrame(String title)

{

setTitle(title);

setSize(400,200);

show();

}

}

На первый взгляд структура программы не совсем привычна - в функции main создается объект того же класса, к которому принадлежит функция main. Зато при создании объекта можно вызвать конструктор с параметрами.  Если вы запустите это приложение, то сразу же обратите внимание, что кнопка закрытия окна не работает. Для обработки событий окна нужно писать специальный код. Он может выглядеть, например, так (код располагается в конструкторе)

addWindowListener(

newWindowAdapter()

{ public void windowClosing(WindowEvent e)

{

dispose();

System.exit(0);

}

};

76.

Работа с графикой и цветом.В данном разделе рассмотрим рисование в окне апплета простейших геометрических фигур. Начальной точкой каждого окна считается его левый верхний угол с координатами (0, 0) . Координаты задаются в пикселях. Первая координата увеличивается слева направо. Вторая координата увеличивается сверху вниз. Если фигура (линия) превосходит по размеру окно апплета, то она обрезается.Вся информация выводится в окно апплета с помощьюграфического контекста, который находится в классе Graphics и может быть получен разными способами, например, в качестве параметра при вызове метода Paint() (То есть это то, что мы использовали во всех предыдущих примерах). Фигуры изображаются выбранным в данный момент цветом, а по умолчанию черным. Ниже приводятся графические методы:

1. Рисование прямых линий. drawLine(X1, Y1, X2, Y2); Здесь: X1, Y1 - координаты начальной точки, X2, Y2 - координаты конечной точки.

2. Рисование прямоугольников. Вывод контура прямоугольника: drawRect(X1, Y1, HX, HY); Здесь: X1, Y1 - координаты верхнего левого угла прямоугольника, HX, HY - длина и высота прямоугольника.Вывод заполненного прямоугольника: fillRect(X1, Y1, HX, HY);с теми же значениями параметров.Прямоугольник с закругленными углами: drawRoundRect(X1, Y1, HX, HY, DX, DY); первые 4 параметра не изменились:  X1, Y1 - координаты верхнего левого угла прямоугольника, HX, HY - длина и высота прямоугольника, DX, DY - соответственно диаметры закруглений вдоль осей.Заполненный прямоугольник с закругленными углами: fillRoundRect(X1, Y1, HX, HY, DX, DY); с теми же значениями параметров.

3. Рисование эллипсов и окружностей. Для изображения контура эллипса используется метод: drawOval(X1, Y1, HX, HY); в качестве параметров используются параметры описанного прямоугольника.Для изображения заполненного эллипса эллипса используется метод: fillOval(X1, Y1, HX, HY);Для изображения круга задайте квадрат в качестве описанного прямоугольника.

4. Рисование дуг. Дуга изображается с помощью следующих методов: drawArc(X1, Y1, HX, HY, G1, G2); fillArc(X1, Y1, HX, HY, G1, G2); Дуга ограничивается прямоугольником, верхний левый угол которого находится в точке X1, Y1 а ширина и высота - соответственно HX, HY  G1 - начальный угол в градусах, G2 - угол в градусах, образуемый дугой.

5. Рисование многоугольников. Фигуры произвольной формы можно нарисовать с помощью следующих методов: drawPolygon(X[ ], Y[ ], N); fillPolygon(X[ ], Y[ ], N); вершины многоугольника задаются парами координат, содержащихся в массивах X[ ], Y[ ] Число вершин многоугольнике задается параметром N.Экземпляр графического объекта Graphics g

g.setColor(Color color); // установкацвета

Color.RED, BLUE, CYAN, GREE, ....

Color(int r, int g, int b)

Использование статических переменных класса Color:

Color.blue, Color.BLUE, Color.red

Конструктор

newColor(r, g, b);

Пример.newColor(255, 100, 100) светло-красный

77.

Установка режима рисования Режим рисования (paintmode) определяет спoсоб изображения объектов в окне. По умолчанию при выводе новых объектов они накладываются на все ранее существующее содержимое окна. Однако с помощью методаsetXORMode() можно смешивать цвет новых объектов с цветом уже существующих.voidsetXORMode(Color цвет)где параметр цвет определяет цвет для рисования объекта в окне. Преимущество режима смешивания цветов состоит в том, что новый объект всегда будет видимым независимо от цвета  объекта, на фоне которого он был нарисован.    Чтобы вернуться к режиму наложения следует использовать setPaintMode().voidsetPaintMode() Режим наложения цветов следует использовать для обычного вывода в окно, а режим смешивания - в специальных целях. Следующая программа выводит на экран перекрестие для отслеживания положения указателя мыши. Этот крестик выводится в окне в режиме рисования XOR и постоянно остается видимым.// Демонстрация цветов importjava.awt.*; importjava.applet.*; /*   <appletcode = "XOR" width=300 height=200>   </applet> */

publicclass XOR extendsApplet {   intchsX = 100, chsY = 100;   // Рисование перекрестия для   // отображения положения мыши   publicbooleanmouseMove(Eventevtobj, int x, int y){     chsX = x-10;     chsY = y-10;     repaint();     returntrue;   }

publicvoidpaint(Graphics g) {     g.drawLine(0, 0, 100, 100);     g.drawLine(0, 100, 100, 0);     g.setColor(Color.blue);     g.drawLine(40, 25, 250, 180);     g.drawLine(75, 90, 400, 400);     g.setColor(Color.green);     g.drawRect(10, 10, 60, 50);     g.fillRect(100, 10, 60, 50);     g.setColor(Color.red);     g.drawRoundRect(190, 10, 60, 50, 15, 15);     g.fillRoundRect(70, 90, 140, 100, 30, 40);     g.setColor(Color.cyan);     g.drawLine(20, 150, 400, 40);     g.drawLine(5, 290, 80, 19); // Перекрестие выводится в режиме XOR     g.setXORMode(Color.black);     g.drawLine(chsX-10, chsY, chsX+10, chsY);     g.drawLine(chsX, chsY-10, chsX, chsY+10);     g.setPaintMode();   } }

78.

Работа с шрифтами.

Определение характеристик шрифта (объект FontDescription). Свойство fontName объекта FontDescription может содержать одно имя или список имен, разделенных запятыми. Например, в списке «Arial, Helvetica, _sans» проигрыватель Flash Player или среда AIR сначала ищет «Arial», затем «Helvetica», а после «_sans», если не удалось найти первые два шрифта. Набор имен шрифтов включает три имени общих шрифтов устройства: «_sans», «_serif» и «_typewriter». Они соотносятся с определенными шрифтами устройства в зависимости от системы воспроизведения. Полезно указывать имена по умолчанию, подобные этим, во всех описаниях шрифтов, использующих шрифты устройства. Если свойство fontName не определено, по умолчанию используется «_serif». Свойству fontPosture можно задать либо значение по умолчанию (FontPosture.NORMAL), либо курсивное начертание (FontPosture.ITALIC). Свойству fontWeightможно задать значение по умолчанию (FontWeight.NORMAL) либо полужирное начертание (FontWeight.BOLD).Встроенные шрифты и шрифты устройства. Свойство fontLookup объекта FontDescription указывает, какой шрифт должен использовать проигрыватель Flash Player или AIR для визуализации текста: встроенный или имеющийся на устройстве. Если указан шрифт устройства (FontLookup.DEVICE), среда выполнения ищет шрифт в системе воспроизведения. Если указан встроенный шрифт (FontLookup.EMBEDDED_CFF), среда выполнения ищет встроенный шрифт с заданным именем в SWF-файле. Эта настройка поддерживает только компактные встроенные шрифты CFF (Compact Font Format). Если указанный шрифт не найден, используется шрифт устройства по умолчанию. Использование шрифтов устройства позволяет уменьшить размер SWF-файла. Встроенные шрифты обеспечивают правильное отображение на разных платформах.Режим визуализации и доводка до пикселов. В Flash Player 10 и Adobe AIR 1.5 добавлена визуализация CFF (компактные встроенные шрифты). При использовании данного типа визуализации экранные шрифты становятся более разборчивыми, а отображение текста, написанного мелким шрифтом, осуществляется более качественно. Эта настройка применяется только к встроенным шрифтам. В объекте FontDescription это значение (RenderingMode.CFF) используется по умолчанию для свойства renderingMode. Задайте значениеRenderingMode.NORMAL, чтобы выбрать тип визуализации, который применялся в проигрывателе Flash Player 7 и более ранних версиях. Когда выбрана CFF-визуализация, второе свойство, cffHinting, регулирует привязку горизонтальных линий шрифта к подпиксельной сетке. По умолчанию используется значение CFFHinting.HORIZONTAL_STEM, которое включает привязку к пикселам. Если задать этому свойству значение CFFHinting.NONE, доводка отключается. Эта настройка подходит для анимации и крупного шрифта. Блокировка и клонирование объектов FontDescription. Когда объект FontDescription присваивается объекту ElementFormat, его свойство locked автоматически получает значение true. При попытке изменить заблокированный объект FontDescription выдается ошибка IllegalOperationError. Лучше всего давать полное определение такому объекту, прежде чем присваивать его экземпляру ElementFormat. Если требуется изменить существующий экземпляр FontDescription, сначала нужно проверить значение свойства locked. Если оно имеет значение true, используйте метод clone(), чтобы создать незаблокированную копию объекта. Свойства такого объекта можно изменить, и после этого его можно назначить экземпляруElementFormat. Новые строки, созданные из этого объекта TextElement, будут иметь новое форматирование. Предыдущие строки, созданные из этого объекта ранее, останутся без изменений.

79.

Методы и интерфейсы апплетов.

Параметры тега <applet>

Перечислим все параметры тега <applet>. Обязательные параметры:

code — URL-адрес файла с классом апплета или архивного файла;

width и height — ширина и высота апплета в пикселах. 

Необязательные параметры:

codebase — URL-адрес каталога, в котором расположен файл класса апплета. Если этот параметр отсутствует, браузер будет искать файл в том же каталоге, где размещен соответствующий HTML-файл;

archive — файлы всех классов, составляющих апплет, могут быть упакованы архиватором ZIP или специальным архиватором JAR в один или несколько архивных файлов. Параметр задает URL-адреса этих файлов через запятую;

align — выравнивание апплета в окне браузера. Этот параметр имеет одно из следующих значений:ABSBOTTOM, ABSMIDDLE, BASELINE, BOTTOM, CENTER, LEFT, MIDDLE, RIGHT, TEXTTOP, TOP;

hspace и vspace — горизонтальные и вертикальные поля, отделяющие апплет от других объектов в окне браузера в пикселах;

download — задает порядок загрузки изображений апплетом. Имена изображений перечисляются через запятую в порядке загрузки;

name — имя апплета. Параметр нужен, если загружаются несколько ап-плетов с одинаковыми значениями code и codebase;

style — информация о стиле CSS (Cascading Style Sheet); title — текст, отображаемый в процессе выполнения апплета;

alt — текст, выводимый вместо апплета, если браузер не может загрузить его;

mayscript — не имеет значения. Это слово указывает на то, что апплет будет обращаться к тексту JavaScript.

Между тегами <applet> и </applet> можно написать текст, который будет выведен, если браузер не сможет понять тег <applet>.

Методы апплета

Метод getCodeBase () возвращает URL-адрес каталога, в котором лежит файл класса апплета.

Метод getoocumentBase () возвращает URL-адрес каталога, в котором лежит HTML-файл, вызвавший апплет.

Браузер реализует интерфейс Appletcontext, находящийся в пакете java.applet. Апплет может получить ссылку на этот интерфейс методом getAppletContext().

С помощью методов getApplet (String name) и getApplets() интерфейса Appletcontext можно получить ссылку на указанный аргументом name апплет или на все апплеты, загруженные в браузер.

Метод showDocument(URL address) загружает в браузер HTML-файл с адреса address.

Метод showDocument (URL address, String target) загружает файл во фрейм, указанный вторым аргументом target. Этот аргумент может принимать следующие значения:

_seif — то же окно и тот же фрейм, в котором работает апплет; 

_parent — родительский фрейм апплета; 

_top — фрейм верхнего уровня окна апплета; 

_biank — новое окно верхнего уровня;

name — фрейм или окно с именем name, если оно не существует, то будет создано.

80.

Java 3D что такое ? Пример использования.Scenegraph (Граф сцены) - расположение 3-хмерных объектов в древовидной структуре, которое полностью определяет содержимое виртуальной вселенной, а также то как вселенная должна быть отренедрена (rendered)Иерархия классов Java3D - коллекция объектов, описывающих отображаемую виртуальную вселенную.

javax.media.j3dpackage - вAPIопределено более 100 классов в пакете

Их часто называют Java3Dcoreclasses.

Для простых сцен достаточно десятка объектов.

Помимо пакета Java3Dcore, часто используются и другие.

com.sun.j3d.utils package – егочастоназываютJava3D utility classes. Сoreclasspackageвключаетв себя лишь низкоуровневые классы, необходимые для программирования на Java3D. Utilityclasses– удобные и мощные классы, в добавление к основным.

4 основныхкатегории utility classes: content loaders, scene graph construction aids, geometry classes, and convenience utilities.

java.awtpackage

javax.vecmath package

visualobject– объект графа сцены (например, куб или сфера)

object– экземпляр класса

content – в целом объекты графа сцены

Виртуальная вселенная создается из графа сцены.

Узел – элемент данных (экземпляр класса из Java3D). Дуга – отношение между элементами.

Авторы Java3DAPIРекомендуют следующий алгоритм созданияпрограмм на Java3D

1. Создать Canvas3D (наследник Canvas из AWT)

2. Создать VirtualUniverse

3. Создать Locale и присоединить к VirtualUniverse

4. Создать view branch graph

a. View

b. ViewPlatform

c. PhysicalBody

d. PhysicalEnvironment

e. ПрисоединитьобъектыViewPlatform, PhysicalBody, PhysicalEnvironment, Canvas3D к View

5. Создать content branch graph(s)

6. Скомпилировать branchgraph(s)

7. Присоединить полученные подграфы к Locale

Зачастую программы на Java3D имеют одинаковую систему viewbranchgraph. Ввиду этого используют класс SimpleUniverse

81.

Работа с изображениями и звуком в Java.Интерфейс imageConsumer нет нужды реализовывать, обычно используется его готовая реализация — класс imageFilter. Несмотря на название, этот класс не производит никакой фильтрации, он передает изображение без изменений. Для преобразования изображений данный класс следует расширить, переопределив метод setPixeiso. Результат преобразования следует передать потребителю, роль которого играет поле consumer этого класса.В пакете java. awt. image есть четыре расширения класса ImageFilter:

CropImageFilter (int x, int у, int w, int h) — выделяет фрагмент изображения, указанный в приведенном конструкторе;

RGBimageFilter — позволяет изменять отдельные пикселы; это абстрактный класс, он требует расширения и переопределения своего метода filterRGBO;

RepдicateScaieFilter (int w, int h) — изменяет размеры изображения на указанные в приведенном конструкторе, дублируя строки и/или столбцы при увеличении размеров или убирая некоторые из них при уменьшении;

AreaAveragingScaleFilter (int w, int h) — расширение предыдущего класса; использует более сложный алгоритм изменения размеров изображения, усредняющий значения соседних пикселов.

Применяются эти классы совместно со вторым классом-поставщиком, реализующим интерфейс ImageProducer — классом FilteredlmageSource. Этот класс преобразует уже готовую продукцию, полученную от другого поставщика producer, используя для преобразования объект filter класса-фильтра imageFilter или его подкласса, Оба объекта задаются в конструктореFilteredlmageSource(ImageProducer producer, ImageFilter filter)Все это кажется очень запутанным, но схема применения фильтров всегда одна и та же.Чтобы изменить отдельные составляющие цвета, надо прежде всего посмотреть тип хранения элементов в Bufferedimage, по умолчанию это TYPE_INT_RGB. Здесь три составляющие — красная, зеленая и синяя. Каждая составляющая цвета занимает один байт, все они хранятся в одном числе типа int. Затем надо составить таблицу новых значений составляющих. Потом заполняем данный массив нужными значениями составляющих каждого цветаПо полученной таблице создаем экземпляр класса ByteLookupTabie, который свяжет эту таблицу с буфером данных. Этот экземпляр используем для создания объекта класса LookupOp. Наконец, применяем метод filter () этого класса.Звук. Как было указано в предыдущей главе, в апплетах реализуется интерфейс Audioclip. Экземпляр объекта, реализующего этот интерфейс можно получить методом getAudioClip(), который, кроме того, загружает звуковой файл, а затем пользоваться методами play о, loop о и stop о этого интерфейса для проигрывания музыки.Для применения данного же приема в приложениях в класс Applet введен статический метод newAudioclp(URL address), загружающий звуковой файл, находящийся по адресу address, и возвращающий объект, реализующий интерфейс Audioclip. Его можно использовать для проигрывания звука в приложении, если конечно звуковая система компьютера уже настроена.Проигрывание звука в Java 2. Проигрыватель звука, встроенный в JVM, рассчитан на два способа записи звука: моно и стерео оцифровку (digital audio) с частотой дискретизации (sample rate) от 8 000 до 48 000 Гц и аппроксимацией (quantization) 8 и 16 битов, и MIDI-последовательности (sequences) типа 0 и 1.

Оцифрованный звук должен храниться в файлах типа AU, WAVE и AIFF. Его можно проигрывать двумя способами.

Первый способ описан в интерфейсе clip. Он рассчитан на воспроизведение небольших файлов или неоднократное проигрывание файла и заключается в том, что весь файл целиком загружается в оперативную память, а затем проигрывается.

Второй способ описан в интерфейсе SourceDataLine. Согласно этому способу файл загружается в оперативную память по частям в буфер, размер которого можно задать произвольно.

Перед загрузкой файла надо задать формат записи звука в объекте класса AudioFormat. Конструктор этого класса:

AudioFormat(float sampleRate, int sampleSize, int channels, boolean signed, boolean bigEndian)

Управлять проигрыванием файла можно с помощью событий. Событие класса LineEvent происходит при открытии, OPEN, и закрытии, CLOSE, потока, при начале, START, и окончании, STOP, проигрывания. Характер события отмечается указанными константами. Соответствующий интерфейс LineListener описывает только один метод update ().

В MIDI-файлах хранится последовательность (sequence) команд для секвен-сора (sequencer) — устройства для записи, проигрывания и редактирования MlDI-последовательности, которым может быть физическое устройство или программа. Последовательность состоит из нескольких дорожек (tracks), на которых записаны MIDI-события (events). Каждая дорожка загружается в своем канале (channel). Обычно дорожка содержит звучание одного музыкального инструмента или запись голоса одного исполнителя или запись нескольких исполнителей, микшированную синтезатором (synthesizer).

82.

Простые методы отображения апплетов. Перерисовка. Использования окна состояния

Аплеты используют оконный интерфейс, применяя библиотеку AWT. Для вывода строк в аплете используется метод drawString(). Обычно он вызывается из paint().

public void drawString(String сообщение, int x, int y)

где сообщение - строка, которая должна выводится в точке с координатамиx,y. Верхний левый угол окна Java имеет координаты 0, 0.     Метод setBackground() задает цвет фона окна аплета. setForeground() задает цвет текста.

void setBackground(Color цвет) void setForeground(Color цвет) Цвет - новый цвет фона и символов. В классе Color определены следующие константы

Color.black

Color.magenta

Color.blue

Color.orange

Color.cyan

Color.pink

Color.darkGray

Color.red

Color.gray

Color.white

Color.green

Color.yellow

Color.lightGray

Цвет фона и символов следует задавать в методе init(). Однако их можно изменить в процессе выполнения аплета. Текущие указания цветов можно получить, вызвав методы getBackground() и getForeground()

Color getBackground() Color getForeground()

Приведем пример простого аплета, в котором используется бирюзовый цвет фона и красный цвет символов

import java.awt.*; import java.applet.*; /*<applet code="Sample" width=300 height=100>   </applet> */ public class Sample extends Applet {   String msg;   // Установка цветов фона и символов   public void init() {     setBackground(Color.cyan);     setForeground(Color.red);     msg = "Init() --";   }   //Инициализация выводимой на экран строки   public void start() {     msg += " Start() --";   }   //Вывод на экран строки

  public void paint(Graphics g) {     msg += " Paint().";     g.drawString(msg, 10, 30);   } }

Перерисовка При необходтмости перерисовать окно аплета вызывается метод repaint(). Метод repaint() определен в AWT. Он вызывает метод update(), который по умолчанию вызывает метод paint(). Метод имеет четыре формы. void repaint() Окно перерисовывается целиком

void repaint(int x, int y, int ширина,int высота)Указывается область, которую необходимо перерисовать

void repaint(long задержка) void repaint(long задержка, int x, int y, int ширина,int высота)Параметр задержка задает максимальное время в миллисекундах, которое должно пройти перед следующим вызовом paint(). Если заданное время истекло, paint() не вызывается и окно не перерисовывается. Использования окна состояния Аплет может не только отображать информацию в своем окне, но и выводить сообщение на панели состояния браузера. Для этого необходимо вызвать метод showStatus(), а в качестве параметра указать строку, которую необходимо вывести на экран.     Работу метода демонстрирует следующий аплет. Необходимо навести курсор мыши на окно аплета.//Использование панели состояния. import java.awt.*; import java.applet.*; /*   <applet code="Status Window" width=300 height=50>   </applet> */ public class StatusWindow extends Applet {   public void init() {     setBackground(Color.cyan);   }   //Вывод msg в окне аплета.   public void paint(Graphics g) {     g.drawString("This in the applet window.", 10, 20);     showStatus("This shown in the status window.");   } }

83.

Теги. Пересылка параметров в апплеты. Методы и интерфейсы в апплетах

Тег <applet> используется для запуска апплета как из HTML-документа, так и из программы appletviewer. Программа appletviewer выполняет каждый найденный ей тег <applet> в отдельном окне, в то время как браузеры позволяют разместить на одной странице несколько апплетов. Синтаксис тэга <APPLET> в настоящее время таков : <APPLET>

CODE = appletFile OBJECT = appletSerialFile WIDTH = pixels HEIGHT = pixels [ARCHIVE = jarFiles] [CODEBASE = codebaseURL] [ALT = alternateText] [NAME = appletInstanceName] [ALIGN = alignment] [VSPACE = pixels] [HSPACE = pixels] > [< PARAM NAME = AttributeNamel VALUE = AttributeValuel >] [< PARAM NAME = AttributeName2 VALUE = AttributeValue2 >] [HTML-текст, отображаемый при отсутствии поддержки Java] </APPLET>

getParameter(String)

Метод getParameter возвращает значение типа String, соответствующее указанному имени параметра. Если вам в качестве параметра требуется значение какого-либо другого типа, вы должны преобразовать строку-параметр самостоятельно. Вы сейчас увидите некоторые примеры использования метода getParameter для извлечения параметров из приведенного ниже примера: <applet code=Testing width=40 height=40> <param name=fontName value=Univers> <param name=fontSize value=14> <param name=leading value=2> <param name=accountEnabled value=true> Ниже показано, как извлекается каждый из этих параметров: String FontName = getParameter("fontName"); String FontSize = Integer.parseInt(getParameter("fontSize")); String Leading = Float.valueOf(getParameter("leading")); String PaidUp = Boolean.valueOf(getParameter("accountEnabled")); Контекст апплета getDocumentBase и getCodeBase

Возможно, Вы будете писать апплеты, которым понадобится явно загружать данные и текст. Java позволяет апплету загружать данные из каталога, в котором располагается HTML-документ, запустивший апплет (база документа - getDocumentBase), и из каталога, из которого был загружен class-файл с кодом апплета (база кода - getCodeBase).

Интерфейс AppletContextДоступ к этому интерфейсу из апплета предоставляется методом getAppletContext. С его помощью апплет может взаимодействовать со страницей, откуда он был загружен, и с браузером. Так, именно в этом интерфейсе определен метод getApplet, с помощью которого можно обратиться по имени к другому апплету, находящемуся на той же странице.Метод showStatus меняет текст поля статуса в окне браузера.Метод showDocument позволяет загрузить новую страницу в браузер.

84.

Пример рисования апплетов

//подключаем библиотеки import java.applet.*; import java.awt.*; //объявляем новый класс public class Body extends Applet{ public void paint(Graphics g) { int yDraw; //Очищаем область. g.clearRect(0, 0, 100,100);  //Выбираем цвет. g.setColor(Color.yellow);  // Рисуем закрашенный прямоугольник. g.fillRect(0, 0, 100, 100);  //Выбираем цвет. g.setColor(Color.black); //Рисуем прямоугольник. g.drawRect(0, 0, 10,10); //Рисуем прямую линию. g.drawLine(0,0,100,100) ; } }

89.

Пример клиент-серверной программы.Машина, которая стоит в одном месте, называется сервером, а машина, которая ищет, называется клиентом. Это различие важно лишь до тех пор, пока клиент пробует соединится с сервером. Как только они соединятся, они становятся двумя сторонами коммуникационного процесса и более не имеет значения, какая машина принимала роль сервера, а какая принимала роль клиента.Таким образом, работа сервера состоит в прослушивании соединения, она выполняется с помощью специального объекта, который вы создаете. Этот пример покажет простейшее использование серверного и клиентского сокета. Все, что делает сервер, это ожидает соединения, затем использует сокет, полученный при соединении, для создания InputStream'а и OutputStream'а. Они конвертируются в Reader и Writer, которые оборачиваются в BufferedReader и PrintWriter. После этого все, что будет прочитано из BufferedReader'а будет переправлено в PrintWriter, пока не будет получена строка "END", означающая, что пришло время закрыть соединение.Клиент создает соединение с сервером, затем создает OutputStream и создает некоторую обертку, как и в сервере. Строки текста посылаются через полученный PrintWriter. Клиент также создает InputStream (опять таки, с соответствующей конвертацией и оберткой), чтобы слушать, что говорит сервер .Вот сервер:

//: c15:JabberServer.java // Очень простой сервер, который просто отсылает // назад все, что посылает клиент. // {RunByHand} import java.io.*; import java.net.*; publicclass JabberServer {    // Выбираем порт вне пределов 1-1024:    publicstaticfinal int PORT = 8080;     publicstatic void main(String[] args) throws IOException {       ServerSocket s = new ServerSocket(PORT);       System.out.println("Started: " + s);       try {          // Блокирует до тех пор, пока не возникнет соединение:          Socketsocket = s.accept();          try {             System.out.println("Connectionaccepted: " + socket);             BufferedReaderin = new BufferedReader(new InputStreamReader(                   socket.getInputStream()));

// Вывод автоматически выталкивается из буфера PrintWriter'ом             PrintWriterout = new PrintWriter(new BufferedWriter(      new OutputStreamWriter(socket.getOutputStream())), true);             while (true) {                Stringstr = in.readLine();                if (str.equals("END"))                   break;                System.out.println("Echoing: " + str);                out.println(str);             }             // Всегда закрываем два сокета...          }          finally {             System.out.println("closing...");             socket.close();          }       }       finally {          s.close();       }    } } // /:~

Вотклиент:

//: c15:JabberClient.java // Оченьпростойклиент, которыйпростопосылает // строкинасерверичитаетстроки, // посылаемыесервером. // {RunByHand} import java.net.*; import java.io.*; public class JabberClient {    public static void main(String[] args) throws IOException {       // Передаем null вgetByName(), получая       // специальный IP адрес "локальнойзаглушки"       // длятестированиянамашинебезсети:       InetAddressaddr = InetAddress.getByName(null);       // Альтернативно, выможетеиспользовать       // адресилиимя:       // InetAddressaddr =       // InetAddress.getByName("127.0.0.1");       // InetAddressaddr =       // InetAddress.getByName("localhost");       System.out.println("addr = " + addr);       Socket socket = new Socket(addr, JabberServer.PORT);       // Помещаемвсевблок try-finally, чтобы       // бытьуверенным, чтосокетзакроется:       try {          System.out.println("socket = " + socket);

BufferedReader in = new BufferedReader(new InputStreamReader(socket                .getInputStream()));          // Выводавтоматически Output быталкиваетсяPrintWriter'ом.          PrintWriter out = new PrintWriter(new BufferedWriter(                new OutputStreamWriter(socket.getOutputStream())), true);          for (int i = 0; i< 10; i++) {             out.println("howdy " + i);             String str = in.readLine();             System.out.println(str);          }          out.println("END");       }       finally {          System.out.println("closing...");          socket.close();       }    } } // /:~

90.

Создание клиент-серверной программы с помощью дейтаграмм.Необходимые средства поддержки протокола UDP находятся в пакете java.net. Для создания дейтаграмм в Java существует классDatagramPacket. При получении дейтаграммы по протоколу UDP класс DatagramPacket используется также для чтения данных, адреса отправителя и метаинформации. Чтобы создать дейтаграмму для отправки на удаленную машину, используется следующий конструктор:publicDatagramPacket(byte[] ibuf, int length, InetAddressiaddr, intiport);Здесь ibuf − массив байт, содержащий кодированное сообщение; length − количество байт, которое должно быть помещено в пакет, что определяет размер дейтаграммы; iaddr − это экземпляр класса InetAddress, который хранит IP-адрес получателя; iport указывает номер порта, на который посылается дейтаграмма. Чтобы получить дейтаграмму, необходимо использовать другой конструктор для объекта DatagramPacket, в котором будут находиться принятые данные. Прототип конструктора имеет вид:publicDatagramPacket(byte[] ibuf, intlength);Дейтаграммы не ограничены определенной длиной; можно создавать как очень длинные, так и очень короткие дейтаграммы. Заметим, однако, что между клиентом и сервером должно существовать соглашение о длине дейтаграмм, поскольку они оба должны создать массив байт нужного размера перед созданием объекта DatagramPacket для посылки или получения дейтаграммы.Когда дейтаграмма получена, как будет продемонстрировано ниже, можно прочитать ее данные. Другие методы позволяют получить метаинформацию, относящуюся к сообщению:

publicintgetLength(); – возвращает количество байт, из которых состоят данные дейтаграммы;

publicbyte[] getData(); – позволяет получить массив, содержащий эти данные;

publicInetAddressgetAddress(); – возвращает адрес отправителя;

publicintgetPort(); –  возвращает номер порта UDP, используемый отправителем.

Отправка и получение дейтаграмм осуществляется при помощи класса DatagramSocket, который создает сокет UDP. У него есть два конструктора, один из которых позволяет системе назначить любой из свободных портов UDP. Другой дает возможность задать конкретный порт, что полезно при разработке сервера. Как и для портов ТСР, в большинстве операционных систем порты с номерами меньше 1024 доступны только процессам с привилегиями суперпользователя.Рассмотрим пример, реализующий приложение клиент/сервер с использованием UDP сокетов. Листинг приложения сервера:

import java.net.*; import java.io.*; publicclassUDPServer { publicfinalstaticint DEFAULT_PORT = 8001;//определение порта //сервера publicfinalString VERSION_CMD = "VERS";//определение версии //команды publicfinalString QUIT_CMD = "QUIT";//определение //команды «выход» publicfinalbyte[] VERSION = { 'V', '2', '.', '0' };//создание массива //для определения версии сервера publicfinalbyte[] UNKNOWN_CMD = { 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'c', 'o', 'm', 'm', 'a', 'n', 'd' };//неизвестная команда publicvoidrunServer() throwsIOException {//метод сервера runServer DatagramSocket s = null;//создание объекта DatagramSocket try { booleanstopFlag = false;//создание флага stopFlag и его инициализация //значением false byte[] buf = newbyte[512];//буфер для приема/передачи дейтаграммы s = newDatagramSocket(DEFAULT_PORT);//привязка сокета к //реальному объекту с портом DEFAULT_PORT System.out.println("UDPServer: Startedon " + s.getLocalAddress() + ":" + s.getLocalPort());//вывод к консоль сообщения while(!stopFlag) {//цикл до тех пор, пока флаг не примет значение true DatagramPacketrecvPacket = newDatagramPacket(buf, buf.length); //создание объекта дейтаграммы для получения данных s.receive(recvPacket);//помещение полученного содержимого в //объект дейтаграммы Stringcmd = newString(recvPacket.getData()).trim();//извлечение //команды из пакета System.out.println("UDPServer: Command: " + cmd); DatagramPacketsendPacket = newDatagramPacket(buf, 0, recvPacket.getAddress(), recvPacket.getPort()); //формирование объекта // дейтаграммы для отсылки данных int n = 0;//количество байт в ответе if (cmd.equals(VERSION_CMD)) {//проверка версии команды n = VERSION.length; System.arraycopy(VERSION, 0, buf, 0, n); } elseif (cmd.equals(QUIT_CMD)) { stopFlag = true;//остановка сервера continue; } else { n = UNKNOWN_CMD.length; System.arraycopy(UNKNOWN_CMD, 0, buf, 0, n); } sendPacket.setData(buf);//установить массив посылаемых данных sendPacket.setLength(n);//установить длину посылаемых данных s.send(sendPacket);//послать сами данные } // while(serverisnotstopped) System.out.println("UDPServer: Stopped"); } finally { if (s != null) { s.close();//закрытие сокета сервера } } } publicstaticvoidmain(String[] args) {//метод main try { UDPServerudpSvr = newUDPServer();//создание объекта udpSvr udpSvr.runServer();//вызов метода объекта runServer } catch(IOExceptionex) { ex.printStackTrace(); } } }

Листинг приложения клиента:

import java.net.*; import java.io.*; publicclassUDPClient {//описание класса клиента publicvoidrunClient() throwsIOException {//метод клиента runClient DatagramSocket s = null;//создание дейтаграммы try { byte[] buf = newbyte[512]; //буфер для приема/передачи дейтаграммы s = newDatagramSocket();//привязка сокета к реальному объету System.out.println("UDPClient: Started"); byte[] verCmd = { 'V', 'E', 'R', 'S' }; DatagramPacketsendPacket = newDatagramPacket(verCmd, verCmd.length, InetAddress.getByName("127.0.0.1"), 8001); //создание //дейтаграммы для отсылки данных s.send(sendPacket);//посылка дейтаграммы DatagramPacketrecvPacket = newDatagramPacket(buf, buf.length);//создание дейтаграммы для получения данных s.receive(recvPacket);//получение дейтаграммы Stringversion = newString(recvPacket.getData()).trim();//извлечение //данных (версии сервера) System.out.println("UDPClient: ServerVersion: " + version); byte[] quitCmd = { 'Q', 'U', 'I', 'T' }; sendPacket.setData(quitCmd);//установить массив посылаемых данных sendPacket.setLength(quitCmd.length);//установить длину посылаемых // данных s.send(sendPacket); //послать данные серверу System.out.println("UDPClient: Ended"); } finally { if (s != null) { s.close();//закрытие сокета клиента } } } publicstaticvoidmain(String[] args) {//метод main try { UDPClientclient = newUDPClient();//создание объекта client client.runClient();//вызов метода объекта client } catch(IOExceptionex) { ex.printStackTrace(); } } }

Вначале запустите сервер, затем клиент. В результате на сервере появятся строки:

UDPServer: Startedon 0.0.0.0/0.0.0.0:8001 UDPServer: Command: VERS UDPServer: Command: QUIT UDPServer: Stopped

На клиенте появятся строки:

UDPClient: Started UDPClient: ServerVersion: V2.0 UDPClient: Ended

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]