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

2.4 Апплет двойного назначения, реализующий интерфейс Runnable

Рассмотрим шаблон апплета двойного назначения, реализующего интерфейс Runnable, создаваемый системой автоматизированной разработки шаблонов апплета Java Аpplet Wizard, встроенной в Microsoft Visual J++. Данный пример во многом похож на пример 2, но новом апплете не только демонстрируется периодическое обновление окна с использованием многозадачности (одновременно с работой апплета выполняется еще одна задача), но и поддерживается возможность работы программы как независимого приложения.

Для создания шаблона апплета Multi (пример 3) среде разработки Microsoft Visual J++ выбрать пункт «New» меню «File». В появившейся диалоговой панели выбрать закладку «Projects» и отметить тип «Java Аpplet Wizard». В поле Name следует ввести имя апплета (Multi). После нажатия на кнопку «Create» на экране появятся по очереди несколько диалоговых панелей, в которой нужно описать создаваемый шаблон апплета.

В первой диалоговой панели в поле «How would you like to be able to run your program» следует включить переключатель «As an applet and as an application». При этом создаваемая программа сможет работать как под управлением WWW-навигатора, так и как самостоятельное приложение.

Система Java Applet Wizard может создать образец документа HTML, в который будет включен разрабатываемый апплет. Для этого во второй диалоговой панели необходимо включить переключатель «Yes, please» в поле «Would you like a sample HTML file».

В третьей диалоговой панели можно указать, будет ли апплет создавать потоки (мультизадачный режим). Так апплет Multi будет создаваться как многозадачный, то в поле «Would you like your applet to be multi-threaded» необходимо включить переключатель «Yes, please».

На вопрос «Would you like support for animation» можно утвердительно ответить только в том случае, если апплет мультизадачный. Но для создаваемого приложения Multi анимация не предполагается поддерживаться, поэтому следует установить переключатель «No, thank you».

Три переключателя, расположенные в поле «Which mouse event handlers would you like added», позволяют автоматически добавить обработчики сообщений от мыши. Для данного приложения следует оставить переключатели невключенными..

С помощью четвертой панели можно указать, какие параметры должны передаваться апплету через документ HTML при запуске. Для приложения Multi никаких параметров передавать не нужно.

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

После завершения заполнения последней панели выдается информационное окно, в котором перечисляются заданные ранее параметры приложения. Если нажать кнопку «Ok», то требуемый проект будет создан.

В результате работы системы Java Applet Wizard будет создано три файла с исходными текстами: текст апплета (файл Multi.java и файл MultiFrame.java) и HTML-документ (файл Multi.html).

Рассмотрим тексты создаваемых файлов (комментарии, создаваемые Java Applet Wizard, переведены в данном примере на русский язык). Тексты подобных шаблонных файлов содержатся в Приложении 6 и их можно в дальнейшем использовать в качестве шаблонов апплета двойного назначения, реализующего интерфейс Runnable.

Листинг Java-файла класса апплета:

//*************************************************************

// Multi.java: Applet

//

//*************************************************************

import java.applet.*;

import java.awt.*;

import MultiFrame;

public class Multi extends Applet implements Runnable

{

// Поток, который будет работать одновременно с апплетом

// --------------------------------------------------------------

private Thread m_Multi = null;

// Признак режима работы программы:

// true/false - приложение/апплет

//--------------------------------------------------------------------------

private boolean m_fStandAlone = false;

//--------------------------------------------------------------------------

public static void main(String args[])

{ // Создать рамку (фрейм) для апплета

MultiFrame frame = new MultiFrame("Title");

// До изменения размеров фрейма отобразить его.

// Это необходимо для того, чтобы метод insert()

// выдавал правильные значения

frame.show(); frame.hide();

frame.resize(frame.insets().left + frame.insets().right + 320,

frame.insets().top + frame.insets().bottom + 240);

// Создание объекта апплета, связывание апплета и фрейма

Multi applet_Combi = new Multi();

frame.add("Center", applet_Combi);

// Установление признака режима работы - приложение

applet_Combi.m_fStandAlone = true;

// Вызов методов ааплета для его запуска

applet_Combi.init();

applet_Combi.start();

// Отображение окна фрейма

frame.show();

}

//--------------------------------------------------------------------------

public Multi()

{ // Сделать: Добавьте сюда код конструктора

}

//--------------------------------------------------------------------------

public String getAppletInfo()

{ return "Name: CombiApplet\r\n" +

"";

}

//--------------------------------------------------------------------------

public void init()

{ resize(320, 240);

// Сделать: Добавьте сюда код инициализации

}

//-------------------------------------------------------------------------

public void destroy()

{ // Сделать: Добавьте сюда код завершения работы апплета

}

//--------------------------------------------------------------------------

public void paint(Graphics g)

{ // Сделать: Добавьте сюда код перерисовки окна апплета

g.drawString("Running: " + Math.random(), 10, 20);

}

//--------------------------------------------------------------------------

public void start()

{ // если поток еще не создан, апплет создает

// новый поток как объект класса Thread

if (m_Multi == null)

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

m_Multi.start(); // запуск потока

}

// Сделать: Добавьте сюда код, который должен

// работать при запуске апплета

}

//--------------------------------------------------------------------------

public void stop()

{ // когда пользователь покидает страницу,

// метод stop() класса Thread останавливает поток

if (m_MultiTask != null) // если поток был создан

{ m_Multi.stop(); //остановка потока

m_Multi = null; // сброс ссылки на поток

}

// Сделать: Добавьте сюда код, который должен

// работать при остановке апплета

}

// Метод, который работает в рамках отдельного потока.

// Он вызывает периодическое обновление окна апплета

//--------------------------------------------------------------------------

public void run()

{ // выполняем обновление окна в бесконечном цикле

while (true)

{ try

{ // вызов функции обновления

repaint();

// Сделать: Добавьте сюда код, который должен

// здесь работать в рамках отдельного потока

//выполнение небольшой задержки

Thread.sleep(50);

}

catch (InterruptedException e)

{ // Сделать: Добавьте сюда код, который должен

// здесь работать при генерации исключения

// если при выполнении задержки произошло

// исключение, останавливаем работу апплета

stop();

}

}

}

// Сделать: Добавьте сюда код, необходимый для работы

// создаваемого специализированного апплета

Листинг Java-файла класса фрейма для апплета:

import java.awt.*;

//============================================

// Этот класс действует как окно, в котором отображается апплет,

// когда он запускается как обычное приложение

//============================================

class MultiFrame extends Frame

{

// Конструктор класса

//--------------------------------------------------------------------------

public MultiFrame(String str)

{ super (str);

// Сделать: Добавьте сюда код конструктора

}

//--------------------------------------------------------------------------

public boolean handleEvent(Event evt)

{ switch (evt.id)

{ // при закрытии окна завершается работа приложения

//------------------------------------------------------------------

case Event.WINDOW_DESTROY:

// Сделать: Добавьте сюда код, который должен

// работать при остановке приложения

dispose(); // удаление окна

System.exit(0); // завершение приложение

return true;

default:

// передача сообщения на обработку

// методу базового класса

return super.handleEvent(evt);

}

}

}

Листинг HTML-файла:

<html>

<head>

<title> Multi </title>

</head>

<body>

<hr>

<applet

code= Multi.class

name= Multi

width=320

height=240 >

</applet>

<hr>

</body>

</html>

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