Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
56_Java.pdf
Скачиваний:
210
Добавлен:
18.02.2016
Размер:
2.39 Mб
Скачать

Скачано с сайта 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

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