logo
курсовой Ульяны

1. Апплет с эффектом анимации на основе многопоточности Java и обращением к локальной файловой системе

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.Calendar;

public class Draw extends Applet implements AdjustmentListener, ActionListener,

Runnable {

Thread animThread = null; //Поток для рисования анимированного //изображения

Button b1; // кнопка 1

Button b2; // кнопка 2

Button b3; // кнопка 3

Button b4; // кнопка 4

Button st1;

Button st2;

Choice ch; // выпадающий список

Scrollbar sb; // полпоса прокрутки

TextField tf;// текстовое поле

Label lb1; // надпись

Label lb2;

Canvas canvas;// область для рисования

int x = 10;

int y = 60;

int dy = 1; // "шаг" движения изображения

Panel Left;

Panel Right;

Panel Journal; // панель для размещения файла-журнала

int k = 0;

int t = 0;

Color col1, col2, col3, col4, col5, colf1, colf2, colf3;

Button buttj;

TextArea fileText;

// Имя файла-журнала для записи информации о работе апплета

String fileName = "";

// Раделитель строк (признак конца строки)

String ls;

// Буферизированный символьный поток записи в файл

BufferedWriter out;

public void init() {

col1 = new Color(0, 0, 255);

col2 = new Color(0, 150, 0);

col3 = new Color(250, 150, 50);

col4 = new Color(250, 0, 0);

col5 = new Color(0, 0, 0);

colf1 = new Color(255, 150, 255);

colf2 = new Color(100, 200, 255);

colf3 = new Color(255, 255, 150);

setLayout(new GridLayout(1, 3));

Left = new Panel();

Left.setLayout(new GridLayout(2, 1));

Left.setBackground(colf1);

Right = new Panel();

Right.setLayout(new BorderLayout());

Right.setBackground(colf3);

addToPanel();

add(Left);

add(Right);

// Панель для чтения файла-журнала

Journal = new Panel();

Journal.setLayout(new BorderLayout());

fileText = new TextArea();

fileText.setBackground(Color.white);

Journal.add(fileText, BorderLayout.CENTER);

fileName = getParameter("FileName");

if (fileName == null)

fileName = "log.txt";

ls = System.getProperty("line.separator"); // разделитель строк

buttj = new Button("Чтение файла-журнала");

buttj.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

// Сброс данных из буфера потока (запись в файл)

out.flush();

// Чтение из файла

BufferedReader in = new BufferedReader(new FileReader(

fileName));

String s = "", line;

while ((line = in.readLine()) != null)

s += line + "\n";

fileText.setText(s);

in.close();

} catch (IOException ex) {

fileText.setText("Ошибка чтения файла: " + ls);

fileText.append(ex.toString());

}

}

});

Journal.add(buttj, BorderLayout.NORTH);

add(Journal);

try {

out = new BufferedWriter(new FileWriter(fileName));

} catch (IOException ex) {

fileText.setText("Ошибка при создании потока записи: " + ls);

fileText.append(ex.toString() + ls);

} catch (SecurityException ex) {

fileText.setText("Нет разрешения доступа к файлу: " + ls);

fileText.append(ex.toString() + ls);

buttj.setEnabled(false);

}

if (out != null) {

Calendar c = Calendar.getInstance();

String dateMessage = "Дата и время: "

+ c.get(Calendar.DAY_OF_MONTH) + "/"

+ (c.get(Calendar.MONTH) + 1) + " - "

+ c.get(Calendar.YEAR) + " " + c.get(Calendar.HOUR_OF_DAY)

+ ":" + c.get(Calendar.MINUTE);

writeLogMessage(dateMessage);

writeLogMessage("Инициализация апплета завершена");

}

}

// -----------------Блок прослушивание от полосы прокрутки--------

// реализация блока прослушивания

public void adjustmentValueChanged(AdjustmentEvent e) {

Scrollbar sb = (Scrollbar) e.getSource();

int c = e.getValue();

setTextVal(c);

canvas.repaint();

}

Scrollbar getSb() {

return sb;

}

void setSbVal(int value) {

sb.setValue(value);

setTextVal(value);

}

void setTextVal(int value) {

tf.setText(String.valueOf(value));

}

public void addToPanel() {

Panel UpperLeft = new Panel();

UpperLeft.setLayout(new GridLayout(5,1,1,25));

UpperLeft.setBackground(colf2);

lb1 = new Label("Цвет текста:", Label.LEFT); // Создание надписи

ch = new Choice(); // Создание выпадающего списка

ch.addItem("Синий");

ch.addItem("Зеленый");

ch.addItem("Оранжевый");

ch.addItem("Красный");

ch.addItem("Черный");

//------Блок прослушивания событий от выпадающего списка-----

ch.addItemListener(new ItemListener() // регистрация

{

public void itemStateChanged(ItemEvent e) // реализация

{

String colorname = (String) e.getItem();

if ("Синий".equals(colorname)) {

canvas.setForeground(col1);

} else if ("Зеленый".equals(colorname)) {

canvas.setForeground(col2);

} else if ("Оранжевый".equals(colorname)) {

canvas.setForeground(col3);

} else if ("Красный".equals(colorname)) {

canvas.setForeground(col4);

} else if ("Черный".equals(colorname)) {

canvas.setForeground(col5);

}

canvas.repaint();

}

});

sb = new Scrollbar(Scrollbar.HORIZONTAL, k, 1, 0, 251); // полоса прокрутки

sb.addAdjustmentListener(this);// регистрация блока прослушивания

tf = new TextField(String.valueOf(k));

tf.setEditable(false); // делаем текстовое поле недоступным для

// изменения вручную

st1 = new Button("Start");

st1.addActionListener(this);

st2 = new Button("Stop");

st2.addActionListener(this);

canvas = new Canvas() // Создание панели рисования

{

public void paint(Graphics g) {

g.setFont(new Font("Courier", Font.BOLD, 70));

g.drawString(tf.getText(), x, y);

}

};

Panel DownLeft = new Panel();

DownLeft.setLayout(new GridLayout(2, 2, 10, 10));

b1 = new Button("Влево вверх");

b2 = new Button("Вправо вверх");

b3 = new Button("Влево вниз");

b4 = new Button("Вправо вниз");

// ---------------Блоки прослушивания от кнопок--------------

b1.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = 10;

y = 60;

canvas.repaint();

}

});

b2.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = Right.getSize().width - 130;

y = 60;

canvas.repaint();

}

});

b3.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = 10;

y = Right.getSize().height - 10;

canvas.repaint();

}

});

b4.addActionListener(new ActionListener()// регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = Right.getSize().width - 130;

y = Right.getSize().height - 10;

canvas.repaint();

}

});

// -------------- Добавление компонентов на панель----------------

UpperLeft.add(lb1);

UpperLeft.add(ch);

UpperLeft.add(st1);

UpperLeft.add(st2);

UpperLeft.add(sb);

DownLeft.add(b1);

DownLeft.add(b2);

DownLeft.add(b3);

DownLeft.add(b4);

Right.add(canvas, BorderLayout.CENTER);

Left.add(UpperLeft);

Left.add(DownLeft);

add(Right);

}

// ===========================Работа с потоками=========================

public void start() // запуск потока

{

animThread = new Thread(this); // создание потока

animThread.start();// запуск объект потока

st1.setEnabled(false);

st2.setEnabled(true);

if (out != null)

writeLogMessage("Поток апплета запущен");

}

public void stop() // завершение потока

{

animThread = null;

st1.setEnabled(true);

st2.setEnabled(false);

if (out != null)

writeLogMessage("Поток апплета остановлен");

}

// Уничтожение апплета

public void destroy() {

if (out != null) {

writeLogMessage("Выполнение апплета завершено");

try {

out.close();

} catch (IOException ex) {

}

}

}

public void run() {

Thread thisThread = Thread.currentThread();// текущий поток

while ((animThread == thisThread) && (k < 251) && (t < 251))

// пока работает поток, и пока параметры (счетчики) меньше 251

{

canvas.repaint(); // перерисовка панели Right

sb.setValue(k);//полосе прокрутки устанавливается значение k

t = sb.getValue();// в t заносится значение полосы прокрутки

tf = new TextField(String.valueOf(t)); // в текстовое поле //заносится значение t

k++;

if ((k == 251) || (t == 251)) // по достижении 251 счетчик

//обнуляется

{

k = 0;

t = 0;

}

MoveText(); // запуск метода MoveText()

try {

thisThread.sleep(60); // приостановить поток

} catch (InterruptedException e) {

return; // завершить поток

}

}

}

private void MoveText() // метод для движения цифр по вертикали

{

if (y == (Right.getSize().height - 10) && dy == 1) {

dy = -1; // меняем направление движения на противоположное

}

if (y == 60 && dy == -1) {

dy = 1; // меняем направление движения на противоположное

}

y += dy;

}

public void actionPerformed(ActionEvent e) {

String acm = e.getActionCommand();

if ("Start".equals(acm))

start();

if ("Stop".equals(acm))

stop();

}

// Вывод сообщения в буферизированный поток для записи в файл

private void writeLogMessage(String message) {

try {

out.write(message);

out.newLine();

} catch (IOException ex) {

fileText.setText("Ошибка записи в файл:" + ls);

fileText.append(ex.toString() + ls);

}

}

}