
- •Особенности языка Java
- •История Java
- •Характерные особенности Java
- •Разработка и выполнение Java приложения:
- •Понятие среды выполнения Java
- •Переносимость языка Java
- •Высокая производительность языка Java
- •Типы Java-приложений
- •Автономное (самостоятельное) приложение – application
- •Апплет – applet
- •Комбинированное приложение
- •Сервлет – servlet
- •Мидлет – midlet
- •Различия между автономными приложениями и апплетами
- •Автономное приложение
- •Апплет
- •Этапы жизненного цикла апплета
- •Этапы жизненного цикла в соответствии со стандартом Sun:
- •Этап инициализации
- •Этап запуска
- •Этап останова
- •Этап уничтожения
- •Этап рисования (перерисовки) окна апплета
- •Отличия Java от C++
- •Конструкторы классов
- •«Сборщик мусора»
- •Типы данных в Java
- •Простые типы
- •Ссылочные (объектные) типы
- •Строки в Java
- •Массивы в Java
- •Классы в Java
- •Особенности реализации
- •Пакеты
- •Управление доступом к элементам класса
- •Поля класса
- •Методы
- •Перегрузка и переопределение методов
- •Ключевые слова THIS и SUPER
- •Интерфейсы в Java
- •Понятие Java API
- •Пакеты ядра Java API (в JDK 1.0):
- •Развитие ядра Java API (в новой версии JDK и в Java 2)
- •Основные понятия AWT
- •Компоненты
- •Контейнеры
- •Компоновки. Менеджеры компоновки
- •События
- •События. Обработка событий
- •Иерархия классов-событий
- •Семантические события и их источники-компоненты AWT
- •Модель делегирования событий
- •Методы, объявленные в интерфейсах для семантических событий
- •Способы реализации блока прослушивания событий от AWT-компонента
- •Понятие класса-адаптера
- •Комбинированное приложение Java. Обработка события WindowEvent
- •Исключения в Java и их обработка
- •Иерархия классов исключений
- •Различия между исключениями Exception и ошибками Error
- •Организация обработки исключений в программе
- •Используемые операторы:
- •Как правильно организовывать обработку исключений
- •Понятия процесса и потока
- •Конструкторы класса Thread
- •Наиболее важные методы класса Thread
- •Способы создания потоков
- •Синхронизация потоков
- •Когда следует использовать синхронизацию потоков?
- •Механизм блокировки объекта
- •Способы использования ключевого слова synchronized
- •Синхронизированные методы
- •Оператор synchronized
- •Преимущества оператора synchronized:
- •Взаимодействие потоков: использование методов wait(), notify(), notifyAll()
- •Стандартные образцы кода использования методов
- •Поток-диспетчер событий AWT
- •Потоки и исключения
- •О группах потоков
- •Технология компонентного программирования JavaBeans
- •Понятие технологии компонентного программирования
- •Этап компиляции
- •Этап разработки
- •Этап создания приложения
- •Этап выполнения
- •Понятие компонентной модели
- •Основные требования к классам Bean-компонентов
- •Соглашения об именах
- •Соглашения об именах для свойств
- •Соглашения об именах для событий
- •Соглашения об именах для методов
- •Использование событий для управления свойствами
- •Связанные свойства
- •Преобразование обычного свойства в связанное
- •Ограниченные свойства
- •Преобразование обычного свойства в ограниченное
- •Ввод-вывод в Java: основные понятия
- •Основные группы классов и интерфейсов пакета java.io
- •Фильтрованные потоки
- •Буферизированные потоки
- •Принципы работы Buffered-потоков
- •Входные потоки
- •Выходные потоки
- •Канальные потоки
- •Синхронизация потоков данных
- •Понятие отражения (рефлексии)
- •Класс java.lang.Class
- •Классы пакета java.lang.reflect
- •Понятие интроспекции
- •Понятие сериализации
- •Обеспечение сериализуемости Bean
- •Выполнение базовой сериализации
- •Пример с сериализацией (см. SerializationDemo.java)
- •Настройка сериализации
- •Методы readObject и writeObject
- •Интерфейс Externalizable
- •Создание экземпляров сериализованных Bean
- •Приложение
- •// Файл HelloApplet.java
- •// Файл MyApplet.java
- •// Файл StringDemo.java
- •// Файл ConstrDemo.java
- •// Фрагменты файла AnimBallsPlus.java

Скачано с сайта http://ivc.clan.su
{
int у = 0;
g.drawString("А.а до создания экземпляра класса = " + aClass, 20, у += 20); g.drawString("aObj.a = " + alnstance, 20, у += 20);
g.drawString("А.а после создания экземпляра класса = " + A.а, 20, у += 20); g.drawString("aObj.a1 = " + aObj.a1, 20, у += 20);
g.drawString("aObj.b1 = " + aObj.b1, 20, у += 20);
g.drawString("A.b |
= " + A.b, 20, у += 20); |
|
g.drawString("А.с |
= " + A.с, 20, у += 20); |
|
g.drawString("A.s |
= |
" + A.s, 20, у += 20); |
g.drawString("A.i |
= |
" + A.i, 20, у += 20); |
}
}
//Результаты работы апплета:
//А.а до создания экземпляра класса = 2
//aObj.a = 4
//А.а после создания экземпляра класса = 4
//aObj.a1 = 2
//aObj.b1 = 30
//A.b = 0.7071067811865476
//А.с = 10
//A.s = String
//A.i = 20
// Файл ConstrDemo.java
//
// Демонстрация использования ключевых слов this и super в конструкторах // и порядка вызова конструкторов
//---------------------------------------------------------------------
//1. В теле конструктора могут использоваться следующие выражения:
//this([список значений параметров]) - вызов другого
//конструктора того же класса с соответствующим списком
//параметров;
//super([список_значений_параметров]) - вызов конструктора
//непосредственного суперкласса с соответствующим списком
//параметров.
//Вызовы конструкторов в теле конструктора должны быть
//указаны как начальные операторы!
//2. Ключевые слова this и super используются при
//инициализации полей экземпляра класса:
//- если поля принадлежат данному классу и их имена
//конфликтуют с идентичными именами параметров конструктора,
//следует при обращении к полям использовать this.имя_поля.
//- если поля наследуются от суперкласса и их имена
//конфликтуют с идентичными именами полей производного класса,
//обращение к ним осуществляется с помощью super.имя_поля;
//------------------------------------------------------------
//Конструктор суперкласса всегда вызывается в конструкторе производного
//класса, причем по цепочке наследования происходят вызовы конструкторов
//всех суперклассов.
//Каждый последующий конструктор в цепочке будет выполняться только после
//выполнения конструктора своего непосредственного суперкласса.
//Конструирование объекта начинается от "самого дальнего" суперкласса,
//поэтому инициализация суперклассе! происходит перед получением доступа
//к нему конструктора производного класса.
//Суперкласс
class A
{
// Поля суперкласса int i1 = 1;
int i2 = 1;
58

Скачано с сайта http://ivc.clan.su
int i3 = 1;
//Первый конструктор суперкласса
A(int i1)
{
this.i1 = i1;
}
//Второй конструктор суперкласса
A(int i1, int i2)
{
this(i1); this.i2 = i2;
}
//Конструктор суперкласса без параметров
A()
{
System.out.println("Constructor A");
}
}
// Производный класс class В extends A
{
int i3 = 10;
// Первый конструктор производного класса В(int i1)
{
// Вызов конструктора A(int i1) суперкласса super(il);
}
// Второй конструктор производного класса В(int i1, int i2)
{
// Вызов конструктора A(int i1, int i2) суперкласса super(i1, i2);
}
//Третий конструктор производного класса
//с уникальным списком параметров
В(int i1, int i2, int j)
{
//Вызов конструктора A(int il, int i2) суперкласса super(i1, i2);
//изменение значения поля i3
i3 = 13 + super.i3 + j;
}
// Конструктор производного класса без параметров В()
{
//Вызов конструктора суперкласса без параметров
//вставляется автоматически!
System.out.println("Constructor В");
}
}
// Основной класс class ConstrDemo
{
public static void main(String[] args)
{
//Создание экземпляров класса В
//с помощью каждого из его конструкторов В b1 = new В(2);
В b2 = new В(3, 4);
В b3 = new В(5, 6, 10); В b4 = new В();
//Вывод на консоль значений полей каждого
//экземпляра класса
System.out.println("b1 = (" + bl.i1 + "," + b1.i2 + "," + b1.i3 + ")");
59

Скачано с сайта http://ivc.clan.su
System.out.println("b2 = (" + b2.i1 + "," + b2.i2 + "," + b2.i3 + ")"); System.out.println("b2 = (" + b3.i1 + "," + b3.i2 + "," + b3.i3 + ")"); System.out.println("b4 = (" + b4.i1 + "," + b4.i2 + "," + b4.i3 + ")");
}
}
//Результат работы программы:
//Constructor A
//Constructor B
//b1 = (2, 1, 10)
//b2 = (3, 4, 10)
//b3 = (5, 6, 21)
//b4 = (1, 1, 10)
//Файл ExtAndImpl.Java
//Пример реализации интерфейса
import java.awt.*; import Java.applet.*; interface Shapes
{
// Методы считаются по умолчанию открытыми (public) абстрактными (abstract)! double getArea();
double getPerimeter();
}
class Coordinates
{
int x, y; Coordinates(int x, int y)
{
this.x = x; this.у = у;
}
}
class Square extends Coordinates implements Shapes
{
int width, height;
Square(int x, int y, int width, int height)
{
super(x, y); this.width = width; this.height = height;
}
//Описание методов без спецификатора доступа public
//приведет к ошибке при компиляции !
public double getArea()
{return (width * height); } public double getPerimeter()
{return (2 * width + 2 * height); }
}
class Circle extends Coordinates implements Shapes
{
int width, height; double r;
Circle(int x, int y, int width, int height)
{
super(x, y); this.width = width; this.height = height;
r = (double)width / 2.0;
}
//Описание методов без спецификатора доступа public
//приведет к ошибке при компиляции!
public double getArea()
{return (r * r * Math.PI); } public double getPerimeter()
{return (2 * Math.PI * r); }
60

Скачано с сайта http://ivc.clan.su
}
public class ExtAndlmpl extends Applet
{
Square Box = new Square(5, 15, 50, 50); Circle Oval = new Circle(5, 100, 50, 50); public void paint(Graphics g)
{
g.drawRect(Box.x, Box.y, Box.width, Box.height); g.drawstring("Area: " + Box.getArea(), 100, 35); g.drawOval(Oval.x, Oval.y, Oval.width, Oval.height); g.drawstring("Area: " + Oval.getArea(), 100, 120);
}
}
//Файл PanDraw1.java
//Пример рисования в окне панели, управляемого событиями
//от компонентов
//Версия для JDK 1.4 с модулем plug-in import java.applet.Applet;
import java.awt.*; import java.awt.event.*;
//Класс апплета, реализующий интерфейсы блоков прослушивания событий
public class PanDrawl extends Applet implements ActionListener, AdjustmentListener
{
Panel p1; Canvas p2; Button b1, b2; Scrollbar sb;
int rw, rh; // ширина и высота изображаемого прямоугольника final static int MAX_RW = 125;
final static int MAX_RH = 75; public void init()
{
rw = MAX_RW; rh = MAX_RH; setLayout(new GridLayout(1, 2));
p1 = new Panel(); // панель для элементов управления p1.setLayout(new BorderLayout());
b1 = new Button("Paint");
b1.addActionListener(this); // регистрация блока прослушивания p1.add(b1, BorderLayout.NORTH);
b2 = new Button("Nothing");
b2.addActionListener(this); // регистрация блока прослушивания p1.add(b2, BorderLayout.CENTER);
sb = new Scrollbar(Scrollbar.HORIZONTAL, 100, 1, 2, 100); sb.addAdjustmentListener(this); // регистрация блока прослушивания p1.add(sb, BorderLayout.SOUTH);
sb.setEnabled(false); // полоса прокрутки недоступна add(p1);
//Компонент типа Canvas на основе анонимного внутреннего класса -
//панель, используемая для рисования прямоугольника
р2 = new Canvas()
{
public void paint(Graphics g)
{
if (!b1.isEnabled()) // если кнопка "Paint" недоступна
{
// Размеры панели
int w = p2.getSize().width; int h = p2.getSize().height; // Рисование прямоугольника
g.drawRect((w - MAX_RW) / 2, (h - MAX_RH) / 2, rw, rh);
}
}
};
61

Скачано с сайта http://ivc.clan.su
p2.setBackground(Color.pink); add(p2);
}
// Реализация блока прослушивания событий от кнопок public void actionPerformed(ActionEvent e)
{
String ac = e.getActionCommand(); if ("Paint".equals(ac))
{
sb.setEnabled(true); // полоса прокрутки доступна b1.setEnabled(false); // кнопка "Paint" недоступна p2.repaint(); // очистка панели (заполнение фоновым цветом) и
//перерисовка
}if ("Nothing".equals(ac))
{
showStatus("Кнопка Nothing не управляет рисованием");
}
}
// Реализация блока прослушивания событий от полосы прокрутки public void adjustmentValueChanged(AdjustmentEvent e)
{
// Текущие размеры прямоугольника
rw = (MAX_RW * e.getValue()) / sb.getMaximum(); rh = (MAX_RH * e.getValue()) / sb.getMaximum();
p2.repaint(); // очистка панели (заполнение фоновым цветом) и перерисовка
}
}
/* Синтаксис new Canvas () {} указывает компилятору, что код в блоке {} определяет анонимный внутренний класс. В результате компиляции будет получен файл класса с именем имя_внешнего_класса$№.class.
Внутренний класс имеет доступ ко всем полям и методам своего внешнего класса (в том числе и private) как к собственным. Элементы внутреннего класса, напротив, известны только в пределах этого класса и не могут использоваться внешним классом непосредственно. */
//Файл PanDraw2.java
//Пример рисования в окне панели, управляемого событиями от компонентов:
//реализация блоков прослушивания событий с помощью
//анонимных внутренних классов.
import java.applet.Applet; import java.awt.*;
import java.awt.event.*;
public class PanDraw2 extends Applet
{
Panel p1;
Canvas p2; //панель для рисования прямоугольника
Button b1; Scrollbar sb;
int rw, rh; // ширина и высота прямоугольника final static int MAX_RW = 125;
final static int MAX_RH = 75; public void init()
{
rw = MAX_RW; rh = MAX_RH; setLayout(new GridLayout(1, 2));
p1 = new Panel(); // панель для элементов управления p1.setLayout(new BorderLayout());
b1 = new Button("Paint");
// Регистрация блока прослушивания b1.addActionListener(new ActionListener()
{
// Реализация блока прослушивания событий от кнопки public void actionPerformed(ActionEvent e)
{
62

Скачано с сайта http://ivc.clan.su
sb.setEnabled(true); b1.setEnabled(false); p2.renaint();
}
});
p1.add(b1, BorderLayout.NORTH);
sb = new Scrollbar(Scrollbar.HORIZONTAL, 100, 1, 2, 100); // Регистрация блока прослушивания sb.addAdjustmentListener(new AdjustmentListener()
{
// Реализация блока прослушивания событий от полосы прокрутки public void adjustmentValueChanged(AdjustmentEvent e)
{
// Текущие размеры прямоугольника
rw = (MAX_RW * e.getValue()) / sb.getMaximum(); rh = (MAX_RH * e.getValue()) / sb.getMaximum(); p2.repaint(); //очистка панели и перерисовка
}
});
p1.add(sb, BorderLayout.SOUTH); sb.setEnabled(false);
add(p1);
p2 = new Canvas()
{
public void paint(Graphics g)
{
if (!bl.isEnabled()) // если кнопка "Paint" недоступна
{
// Размеры панели
int w = p2.getSize().width; int h = p2.getSize().height; // Рисование прямоугольника
g.drawRect((w - MAX_RW) / 2, (h - MAX_RH) / 2, rw, rh);
}
}
};
p2.setBackground(Color.pink); add(p2);
}
}
//Файл PanDraw3.java
//Пример рисования в окне панели, управляемого событиями
//от компонентов:
//используется класс, производный от Panel (или Canvas), в котором
//переопределен метод paint()
import java.applet.Applet; import java.awt.*;
import java.awt.event.*;
class MyPanel extends Canvas implements ActionListener
{
//Ширина и высота изображаемого прямоугольника final static int RECT_W = 75;
final static int RECT_H = 50;
//Флаг разрешения рисования прямоугольника boolean flag = false;
//Реализация блока прослушивания Action-событий public void actionPerformed(ActionEvent e)
{
/* Можно не определять источник события, т.к. используется только одна кнопка
String ас = е.getActionCommand(); if ("Paint".equals(ас)) */
{
flag = true;
63

Скачано с сайта http://ivc.clan.su
setBackground(Color.pink); repaint();
}
}
public void paint(Graphics g) // g - графический контекст компонента // типа MyPanel
{
// Размеры панели
int w = getSize().width; int h = getSize().height; if (flag)
// Рисование прямоугольника
g.drawRect((w - RECT_W) / 2, (h - RECT_H) / 2, RECT_W, RECT_H);
}
}
public class PanDraw3 extends Applet
{
Panel p1; Button b1; MyPanel p2;
public void init()
{
setLayout(new GridLayout(1, 2));
p1 |
= new Panel(); |
// левая панель |
p2 |
= new MyPanel(); |
// правая панель - объект класса MyPanel |
b1 |
= new Button("Paint"); |
// Регистрация блока прослушивания Action-события b1.addActionListener(p2);
p1.add(b1);
add(p1);
add(p2);
}
}
//Файл PanDraw4.java
//Пример рисования в окне панели, управляемого событиями
//от компонентов.
//Для рисования не используется метод paint() панели.
//С помощью метода getGraphics(), наследуемого от класса Component,
//при обработке события от элемента интерфейса пользователя можно получить
//графический контекст панели:
// |
gc = имя_панели.getGraphics(); |
//Далее в графическом контексте вызываются методы класса Graphics.
//Класс апплета, реализующий интерфейсы блоков прослушивания событий
public class PanDraw4 extends Applet implements ActionListener, AdjustmentListener
{
Panel p1; // панель для элементов управления
Canvas p2; // панель-"холст" для рисования прямоугольника
Button b1, b2; Scrollbar sb;
int rw, rh; // ширина и высота изображаемого прямоугольника final static int MAX_RW = 125;
final static int MAX_RH = 75; public void init()
{
rw = MAX_RW; rh = MAX_RH; setLayout(new GridLayout(1, 2)); p1 = new Panel(); p1.setLayout(new BorderLayout()); b1 = new Button("Paint");
b1.addActionListener(this); // регистрация блока прослушивания p1.add(b1, BorderLayout.NORTH);
b2 = new Button("Nothing"); b2.setBackground(Color.cyan);
64

Скачано с сайта http://ivc.clan.su
b2.addActionListener(this); // регистрация блока прослушивания p1.add(b2, BorderLayout.CENTER);
sb = new Scrollbar(Scrollbar.HORIZONTAL, 100, 1, 2, 100); sb.addAdjustmentListener(this); // регистрация блока прослушивания p1.add(sb, BorderLayout.SOUTH);
sb.setEnabled(false); add(p1);
p2 = new Canvas(); p2.setBackground(Color.pink); add(p2);
}
// Реализация блока прослушивания событий от кнопок public void actionPerformed(ActionEvent e)
{
String ac = e.getActionCommand(); if ("Paint".equals(ac))
{
sb.setEnabled(true); b1.setEnabled(false);
//Графический контекст окна панели для рисования
Graphics gc2 = p2.getGraphics();
//Размеры панели
int w = р2.getSize().width; int h = p2.getSize().height;
//Рисование прямоугольника
gc2.drawRect((w - MAX_RW) / 2, (h - MAX_RH) / 2, MAX_RW, MAX_RH); } if ("Nothing".equals(ac))
{
showStatus("Кнопка Nothing не управляет рисованием");
}
}
// Реализация блока прослушивания событий от полосы прокрутки public void adjustmentValueChanged(AdjustmentEvent e)
{
//Графический контекст окна панели для рисования
Graphics gc2 = p2.getGraphics();
//Размеры панели
int w = р2.getSize().width; int h = р2.getSize().height;
//Очистка панели (заполнение фоновым цветом) gc2.setColor(Color.pink);
gc2.fillRect(0, 0, w, h);
//Текущие размеры прямоугольника
rw = (MAX_RW * e.getValue()) / sb.getMaximum(); rh = (MAX_RH * e.getValue()) / sb.getMaximum();
// Рисование прямоугольника gc2.setColor(Color.black);
gc2.drawRect((w - MAX_RW) / 2, (h - MAX_RH) / 2, rw, rh);
}
}
//Файл MouseTrack.java
//Пример реализации блока прослушивания событий от мыши import java.awt.event.*;
import java.awt.*;
import java.applet.Applet; import java.lang.Math;
public class MouseTrack extends Applet implements MouseListener, MouseMotionListener
{
int mx, my; //координаты прямоугольника public void init()
{
addMouseListener(this);
65

Скачано с сайта http://ivc.clan.su
addMouseMotionListener(this);
}
public void paint(Graphics g)
{
g.drawRect(0, 0, getSize().width - 1, getSize().height - 1);
mx = (int)(Math.random() * 1000) % (getSize().width - (getSize().width / 10));
my = (int)(Math.random() * 1000) % (getSize().height - (getSize().height / 10));
g.drawRect(mx, my, (getSize().width / 10) - 1, (getSize().height / 10) –
1);
}
// Реализация методов интерфейса MouseMotionListener
public void mouseDragged(MouseEvent e) { showStatus("mouseDragged"); } public void mouseMoved(MouseEvent e)
{
if ((e.getX() % 3 == 0) && (e.getY() % 3 == 0))
{
showStatus("mouseMoved"); repaint();
}
}
// Реализация методов интерфейса MouseListener public void mousePressed(MouseEvent e)
{
showStatus("mousePressed"); repaint();
}
public void mouseReleased(MouseEvent e)
{
showStatus("mouseReleased");
}
public void mouseEntered(MouseEvent e)
{
showStatus("mouseEntered"); setBackground(Color.pink); repaint();
}
public void mouseExited(MouseEvent e)
{
showStatus("mouseExited"); setBackground(Color.lightGray); repaint();
}
public void mouseClicked(MouseEvent e)
{
showStatus("mouseClicked"); setBackground(Color.yellow);
}
}
//Файл AppletGraffitty.java
//Пример реализации блока прослушивания событий от мыши с помощью
//анонимного внутреннего класса, производного от класса MouseMotionAdapter.
//Источник: Смирнов Н.И. Java 2: Учебное пособие. - М.: ТриЛ, 2000, с.282 import java.awt.*;
import java.awt.event.*; import java.applet.*;
public class AppletGraffitty extends Applet
{
public void init()
{
//Установка цвета фона и цвета изображения
setBackground(Color.cyan);
66

Скачано с сайта http://ivc.clan.su
setForeground(Color.red);
//Регистрация блока прослушивания событий от мыши addMouseMotionListener(
//Анонимный внутренний класс на основе класса-адаптера new MouseMotionAdapter()
{
//метод, наследуемый от класса InputEvent public void mouseDragged(MouseEvent e)
{
if (e.isMetaDown()) //Если нажата правая кнопка мыши,
{
//выполняется рисование маленьких кругов getGraphics().fillOval(e.getX(), e.getY(), 7, 7);
}
}
});
}
}
//Файл CombiApplet.java
//Пример реализации комбинированного Java-приложения import java.applet.*;
import java.awt.*; import java.awt.event.*;
//Основной класс, производный от класса Applet public class CombiApplet extends Applet
{
private Button fButton;
public static void main(String[] args)
{
CombiAppletFrame theApplication =
new CombiAppletFrame("Application-applet"); theApplication.setSize(200, 200); theApplication.show();
public void init()
{
setBackground(Color.red); fButton = new Button("Белый");
fButton.setBackground(Color.white); add(fButton); fButton.addActionListener(
//Анонимный внутренний класс, реализующий интерфейс ActionListener new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (fButton.getLabel() == "Белый")
{
setBackground(Color.white); fButton.setLabel("Красный"); fButton.setBackground(Color.red);
}
else
{
setBackground(Color.red); fButton.setLabel("Белый"); fButton.setBackground(Color.white);
}
}
});
}// Конец метода init
} // Конец класса CombiApplet
// Класс, производный от класса Frame
67

Скачано с сайта http://ivc.clan.su
class CombiAppletFrame extends Frame
{
private CombiApplet fApplet;
public CombiAppletFrame(String name)
{
super(name);
addWindowListener(new CombiWindowAdapter()); fApplet = new CombiApplet(); fApplet.init();
fApplet.start();
add(fApplet);
} // Внутренний класс, производный от класса-адаптера WindowAdapter class CombiWindowAdapter extends WindowAdapter
{
// метод вызывается, когда окно закрывается public void windowClosing(WindowEvent e)
{
fApplet.stop();
fApplet.destroy(); System.exit(0);
}
}// Конец внутреннего класса CombiWindowAdapter
}// Конец класса CombiAppletFrame
//Файл ExceptionDemo.java
//Пример апплета, демонстрирующего определение собственного исключения import java.awt.*;
import java.applet.*;
//Для определения собственного исключения необходимо описать класс
//собственного исключения как производный от класса java.lang.Exception.
//Класс собственного исключения
class NumberRangeException extends Exception
{
public NumberRangeException(String msg)
{ super(msg); } //вызов конструктора суперкласса
}
// Основной класс апплета
public class ExceptionDemo extends Applet
{
String msg; public void init()
{
int num;
String str = getParameter("NUMBER"); if (str == null)
msg = "Отсутствует параметр в файле .html"; else
{
try
{
num = getNumber(str); if (num != -l)
msg = "Число-параметр в файле .html: " + num;
}
catch (NumberRangeException e) { msg = e.getMessage(); }
}
}//init
public int getNumber(String s) throws NumberRangeException
{
int intv = -1; try
{
intv = Integer.parselnt(s);
68

Скачано с сайта http://ivc.clan.su
if (intv < 0 || intv > 50)
{
NumberRangeException e = new NumberRangeException ("Число-параметр не укладывается в заданный диапазон 0-50!");
throw e;
}
}//try
catch (NumberFormatException e)
{
msg = "Ошибка представления параметра - " + е.toString();
}
return intv; }//getNumber
public void paint(Graphics g)
{
g.drawstring(msg, 50, 100);
}
}
//Файл ParamBanner.java (1)
//Пример создания потока посредством расширения класса Thread
//Апплет с бегущей строкой
/* <APPLET CODE="ParamBanner.class" WIDTH=400 HEIGHT=50>
<PARAM NAME="message" VALUE="Использование потока для анимации!">
</APPLET> */ import java.applet.*; import java.awt.*;
import java.awt.event.*;
public class ParamBanner extends Applet
{
String msg; DrawBanner t = null; boolean stopFlag; public void init()
{
setBackground(Color.cyan); setForeground(Color.red);
setFont(new Font("Helvetica", Font.BOLD, 20));
}
public void start()
{
msg = getParameter("message");
if (msg == null) msg = " Message not found."; msg = " " + msg;
// Создание и запуск потока
t = new DrawBanner(this, msg); stopFlag = false;
t.start();
}
public void stop()
{// Завершение выполнения потока stopFlag = true;
t = null;
}
}
// Класс, производный от класса Thread class DrawBanner extends Thread
{
ParamBanner appl; Dimension dimAppWnd; String banner; Graphics g;
public DrawBanner(ParamBanner appl, String str)
{
69

Скачано с сайта http://ivc.clan.su
this.appl = appl; dimAppWnd = appl.getSize(); banner = str;
g = appl.getGraphics();
}
//Переопределение метода run, вьшолняемого как поток команд
//объекта t типа DrawBanner
public void run()
{
char ch;
while (!appl.stopFlag)
{
try
{
g.clearRect(0, 0, dimAppWnd.width, dimAppWnd.height); g.drawstring(banner, 50, 30); Thread.currentThread().sleep(200); // приостановить поток ch = banner.charAt(0);
banner = banner.substring(1, banner.length()); banner += ch;
}
catch (InterruptedException e) { return; } // завершить поток
}
}
}
//Файл ParamBanner.java (2)
//Пример создания потока посредством расширения класса Thread
//Апплет с бегущей строкой
import java.applet.*; import java.awt.*; import java.awt.event.*;
public class ParamBanner extends Applet
{
String msg; DrawBanner t = null; boolean stopFlag; public void init()
{
setBackground(Color.cyan); setForeground(Color.red);
setFont(new Font("Helvetica", Font.BOLD, 20));
}
public void start()
{
msg = getParameter("message");
if (msg == null) msg = " Message not found."; msg = " " + msg;
// Создание и запуск потока t = new DrawBanner(); StopFlag = false; t.start();
}
public void stop()
{
// Завершение выполнения потока stopFlag = true;
t = null;
}
public void paint(Graphics g)
{
g.drawstring(msg, 50, 30);
}
// Внутренний класс, производный от класса Thread
70

Скачано с сайта http://ivc.clan.su
class DrawBanner extends Thread
{
//Переопределение метода run, выполняемого как поток команд
//объекта t типа DrawBanner
public void run()
{
while (!stopFlag)
{
try
{
repaint();
Thread.currentThread().sleep(200); // приостановить поток char ch = msg.charAt(0);
msg = msg.substring(1, msg.length()); msg += ch;
}
catch (InterruptedException e)
{
return; // завершить поток
}
}
}
}
}
//Файл ParamBanner.java (3)
//Пример создания потока посредством реализации интерфейса Runnable
//Апплет с бегущей строкой
//Источник: Ноутон П., Шилдт Г. Java 2. - СПб.: БХВ-Петербург, 2000, с. 607 import java.applet.*;
import java.awt.*; import java.awt.event.*;
public class ParamBanner extends Applet implements Runnable
{
String msg; Thread t = null; public void init()
{
setBackground(Color.cyan); setForeground(Color.red);
setFont(new Font("Helvetica", Font.BOLD, 20));
}
public void start()
{
msg = getParameter("message");
if (msg == null) msg = " Message not found."; msg = " " + msg;
//Создание и запуск потока
t = new Thread(this); t.start();
}
public void stop()
{ // Завершение выполнения потока t = null;
}
public void paint(Graphics g)
{
g.drawstring(msg, 50, 30);
}
//Реализация метода run, выполняемого как поток команд
//объекта t типа Thread
public void run()
{
char ch;
71

Скачано с сайта http://ivc.clan.su
while (t != null)
{
try
{
repaint();
Thread.currentThread().sleep(200); // приостановить поток ch = msg.charAt(0);
msg = msg.substring(1, msg.length()); msg += ch;
}
catch (InterruptedException e)
{
return; // завершить поток
}
}
}
}
//Файл BannerSuspension.java
//Апплет с бегущей строкой.
//Пример использования методов wait() и notify()
//для приостановки и возобновления работы потока.
//Нажатие клавиши мыши приводит к приостановке работы потока,
//повторное нажатие - к возобновлению.
import java.awt.event.*; import java.awt.*; import java.applet.*;
public class BannerSuspension extends Applet implements Runnable, MouseListener
{
String str; |
// отображаемый текст |
char strChars[]; |
// тот же текст в виде массива символов |
Thread t = null; |
// поток, который выводит текст |
int xBegin = 30; |
// позиция вывода первого символа на экране |
boolean threadSuspended; // флаг приостановки потока public void init()
{
str = getParameter("text"); if (str == null)
{
str = "Hello from Java!";
}
int strLength = str.length(); strChars = new char[strLength];
//Преобразование строки в символьный массив str.getChars(0, strLength, strChars, 0);
//Установка шрифта, все символы которого имеют одинаковую ширину setFont(new Font("Monospaced", Font.BOLD, 36));
//Регистрация блока прослушивания событий от мыши addMouseListener(this);
}
public void start()
{
t = new Thread(this); threadSuspended = false; t.start();
}
public synchronized void stop()
{
t = null;
if (threadSuspended)
{
threadSuspended = false; notify();
}
72

Скачано с сайта http://ivc.clan.su
}
public void run()
{
Thread me = Thread.currentThread(); while (t == me)
{
try
{
Thread.sleep(100); synchronized (this)
{
// При нажатии мыши и установленном флаге приостановка потока while (threadSuspended)
wait();
}
}
catch (InterruptedException e) { }
// перерисовка с эффектом "бегущей строки" xBegin -= 5;
repaint();
}
}
public void paint(Graphics g)
{
// Ширина окна апплета
int appWidth = getSize().width; // Ширина символа
int charWidth = g.getFontMetrics().getMaxAdvance(); // Ширина строки
int strWidth = charWidth * str.length();
// Позиция вывода по Y
int у = g.getFontMetrics().getHeight();
for (int i = 0, length = str.length(); i < length; i++)
{
// Позиция вывода текущего символа по X int x = xBegin + charWidth * i;
if (x < 0)
{
if (strWidth > appWidth) x += strWidth;
else
x += appWidth;
}
g.drawChars(strChars, i, 1, x, y);
}
if ((strWidth > appWidth && xBegin < -strWidth)
|| (strWidth <= appWidth && xBegin < -appWidth)) xBegin = 0;
}
// Реализация блока прослушивания событий от мыши public synchronized void mousePressed(MouseEvent e)
{
e.consume();
threadSuspended = !threadSuspended;
//При повторном нажатии мыши и сброшенном флаге
//возобновление работы потока
if (!threadSuspended) notify();
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
73

Скачано с сайта http://ivc.clan.su
}
public void mouseClicked(MouseEvent e) {
}
}
//Файл BannerSuspension.java (2)
//Апплет с бегущей строкой.
//Пример использования методов wait() и notify()
//для приостановки и возобновления работы потока.
//Нажатие клавиши мыши приводит к приостановке работы потока,
//повторное нажатие - к возобновлению.
import java.awt.event.*; import java.awt.*; import java.applet.*;
public class BannerSuspension extends Applet implements Runnable
{
String str; |
// отображаемый текст |
char strChars[]; |
// тот же текст в виде массива символов |
Thread t = null; |
// поток, который выводит текст |
int xBegin = 30; |
// позиция вывода первого символа на экране |
boolean threadSuspended; // флаг приостановки потока public void init()
{
str = getParameter("text"); if (str == null)
{
str = "Hello from Java!";
}
int strLength = str.length(); strChars = new char[strLength];
//Преобразование строки в символьный массив str.getChars(0, strLength, strChars, 0);
//Установка шрифта, все символы которого имеют одинаковую ширину setFont(new Font("Monospaced", Font.BOLD, 36));
//Регистрация и реализация блока прослушивания событий от мыши addMouseListener
(
//Анонимный внутренний класс
new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
e.consume();
//При повторном нажатии мыши и сброшенном флаге
//возобновление работы потока.
//Вызывать следует notify того же объекта, для которого
//вызывался wait()!
//Таким образом, необходимо синхронизировать код внешнего
//объекта при обращении к нему из внутреннего: synchronized (BannerSuspension.this)
{
threadSuspended = !threadSuspended; if (!threadSuspended)
BannerSuspension.this.notify();
}
}
});
}
public void start()
{
t = new Thread(this); threadSuspended = false; t.start();
}
74

Скачано с сайта http://ivc.clan.su
public synchronized void stop()
{
t = null;
if (threadSuspended)
{
threadSuspended = false; notify();
}
}
public void run()
{
Thread me = Thread.currentThread(); while (t == me)
{
try
{
Thread.sleep(100); synchronized (this)
{
// При нажатии мьши и установленном флаге приостановка потока while (threadSuspended)
wait();
}
}
catch (InterruptedException e) { }
// перерисовка с эффектом "бегущей строки" xBegin -= 5;
repaint();
}
}
public void paint(Graphics g)
{
// Ширина окна апплета
int appWidth = getsize().width; // Ширина символа
int charWidth = g.getFontMetrics().getMaxAdvance(); // Ширина строки
int strWidth = charWidth * str.length();
// Позиция вывода по Y
int у = g.getFontMetrics().getHeight();
for (int i = 0, length = str.length(); i < length; i++)
{
// Позиция вывода текущего символа по X int x = xBegin + charWidth * i;
if (x < 0)
{
if (strWidth > appWidth) x += strWidth;
else
x += appWidth;
}
g.drawChars(strChars, i, 1, x, y);
}
if ((strWidth > appWidth && xBegin < -strWidth)
|| (strWidth <= appWidth && xBegin < -appWidth)) xBegin = 0;
}
}
//Файл ColorsBean.java
//Пример простого компонента JavaBeans
package colorsbean; // class-файл помещается в пакет colorsbean import java.awt.*;
import java.awt.event.*;
public class ColorsBean extends Canvas
75

Скачано с сайта http://ivc.clan.su
{ |
|
transient private Color color; |
// цвет компонента (не сохраняется при |
|
// сериализации) |
private boolean rectangular; |
// форма компонента |
private String text = "I am a bean!"; // текст внутри компонента
// Конструктор без параметров, принимаемый по умолчанию public ColorsBean()
{
// Регистрация и реализация блока прослушивания события от мыши addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent me)
{
change();
}
});
rectangular = false; change();
}
//Методы, обеспечивающие доступ к свойству rectangular для чтения и записи public boolean getRectangular()
{
return rectangular;
}
public void setRectangular(boolean flag)
{
this.rectangular = flag; repaint();
}
//Метод, определяющий цвет компонента
public void change()
{
color = randomColor(); repaint();
}
//Метод (закрытый), возвращающий случайно выбранный цвет private Color randomColor()
{
int r = (int)(255 * Math.random()); int g = (int)(255 * Math.random()); int b = (int)(255 * Math.random()); return new Color(r, g, b);
}
//Метод, определяющий внешний вид компонента
public void paint(Graphics g)
{
FontMetrics fm = getFontMetrics(getFont()); Dimension d = getSize();
int h = d.height; int w = d.width;
g.setColor(color); // установка цвета компонента if (rectangular)
{
g.fillRect(0, 0, w - 1, h - 1);
}
else
{
g.fillOval(0, 0, w - 1, h - 1);
}
g.setColor(getBackground()); // цвет строки соответствует цвету фона
//компонента
//Рисование строки в центре (координаты определяются размерами компонента
//и параметрами шрифта)
g.drawstring(text, (w - fm.stringWidth(text)) / 2,
76

Скачано с сайта http://ivc.clan.su
(h + fm.getMaxAscent() - fm.getMaxDescent()) / 2);
}
//Методы переопределяют методы класса Component и используются
//менеджерами компоновки
public Dimension getMinimumSize()
{
//В качестве минимального размера устанавливается предпочтительный размер return getPreferredSize();
}
public Dimension getPreferredSize()
{
//Метод возвращает предпочтительный размер:
//объект типа FontMetrics(метрики шрифта) используется для создания
//объекта размера
FontMetrics fm = getFontMetrics(getFont()); return new Dimension(fm.stringWidth(text) + 100,
fm.getMaxAscent() + fm.getMaxDescent() + 50);
}
}
//Файл FilterDemo.Java
//Демонстрация работы фильтрованного потока.
//Источник: Арнолд К., Гослинг Дж., Холмс Д. Язык программирования
//Java. - М. : Издательский дом "Вильяме", 2001, с. 386-387. import java.io.*;
//Класс фильтрованного потока чтения, который преобразует
//символы к верхнему регистру
class UppercaseConvertor extends FilterReader
{
public UppercaseConvertor(Reader in)
{
super(in); // вызов конструктора суперкласса
}
//Переопределение вариантов методов read для обеспечения
//возможности выполнения операции чтения с последующим
//преобразованием символов результата к верхнему регистру: public int read() throws IOException
{
int с = super.read(); // вызов метода суперкласса return (с == -1 ? с : Character.toUpperCase((char)с));
}
public int read(char[] buf, int offset, int count) throws IOException
{
int nread = super.read(buf, offset, count); // вызов метода суперкласса int last = offset + nread;
for (int i = offset; i < last; i++)
buf[i] = Character.toUpperCase(buf[i]); return nread;
}
}
class FilterDemo
{
public static void main(String args []) throws IOException
{
//В качестве источника данных используется объект класса
//StringReader, осуществляющий чтение символов из строки:
StringReader sre = new StringReader(args[0]);
//Этот объект передается объекту-надстройке (потоку-фильтру)
//в качестве параметра:
FilterReader f = new UppercaseConvertor(sre); int С;
while ((c = f.read()) != -1) // читать, пока не конец потока System.out.print((char)с);
System.out.println();
77