Реализация взаимодействия между апплетами в Java

Цель занятия

Целью занятия является изучение механизма передачи информации из одного апплета в другой, а также способа вызова методов одного апплета из другого и механизм передачи параметров. Дополнительно можно рекомендовать [2, 17].

Краткие теоретические сведения

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

Листинг 2.6. Текст главного апплета

import java.applet.*; import java.awt.*; import java.awt.event.*;

public class lab2 extends Applet implements ActionListener

private String msg="Red";

CheckboxGroup cbg=new CheckboxGroup();

Checkbox cbRed= new Checkbox("Red",cbg,true);

Checkbox cbBlue= new Checkbox("Blue",cbg,false);

Checkbox cbYellow= new Checkbox("Yellow",cbg,false);

Button btn=new Button("Send Color"); public void init()

setLayout(null); add(cbRed); add(cbBlue); add(cbYellow); add(btn);

btn.setBounds(10,10,80,18); cbRed.setBounds(10,30,50,18); cbBlue.setBounds(10,50,50,18) ; cbYellow.setBounds(10,70, 50,18) ; btn.addActionListener(this) ;

public void actionPerformed(ActionEvent e)

Applet receiver=null;

String receiverName="ReceiverApplet"; receiver=getAppletContext().getApplet(receiverName); if(receiver !=null)

{

if (!(receiver instanceof Receiver))

{

showStatus("Not an applet we have been looking for");

}

else

{

showStatus("OK");

((Receiver) receiver).processRequest(returnValue());

}

}

else

showStatus("Can’t find the specified applet");

}

public String returnValue()

{

if (cbRed.getState()) return "Red"; else

if (cbBlue.getState()) return "Blue"; else return "Yellow";

}

}

Соответствующий этой программе HTML-файл имеет следующий вид:

<html>

<body>

<APPLET code="lab2.class" width=300 height=100>

</APPLET>

<APPLET code="Receiver.class" width=300 height=100>

<PARAM name="name" value="ReceiverApplet">

</APPLET>

</Body>

</Html>

Видим, что в этом HTML-файле определены два апплета, соответствующие двум различным pubiic-классам, которые запускаются браузером одновременно. Пока обратим внимание лишь на то, что во втором апплете задается тег:                                                                                          <PARAM

name="name" value="ReceiverApplet">. Запомните, в Java имеется специальная команда, которая возвращает в качестве результата апплет — т. e. целый класс со своими методами и переменными. Это команда getAppiet (). В качестве аргумента данная команда использует значение vaiue из тега PARAM. Теперь найдем то место в программе, где данная команда применена. Вот оно:

Applet receiver=null;

String receiverName="ReceiverApplet"; receiver=getAppletContext().getApplet(receiverName); if(receiver !=null)

{

if (!(receiver instanceof Receiver))

{

showStatus("Not an applet we have been looking for");

}

else

{

showStatus("OK");

Рассмотрим этот фрагмент подробно. Во-первых, он содержится в методе реализации события выбора одного из флажков ведущего апплета, после того как оба апплета будут отображены браузером (рис. 2.5).

Рис. 2.5. Два взаимодействующих апплета

При выборе соответствующего флажка и нажатии кнопки SEND второй апплет окрашивается в тот цвет, который соответствует радиокнопке.

В строке Applet receiver=null объявляется receiver как переменная типа Appiet, которой присваивается изначально пустое значение nuii.

Следующие две строки:

String receiverName="ReceiverApplet"; receiver=getAppletContext().getApplet(receiverName); объявляют строковую переменную receiverName и возвращают в переменную receiver указатель на апплет, содержащий в параметре value значение переменной receiverName, Т. e. "Receiv- erAppiet". Запомним эту команду:

receiver=getAppletContext().getApplet(receiverName).

Далее в программе выполняется проверка того, что получен действительно нужный апплет:

if (!(receiver instanceof Receiver))

showStatus("Not an applet we have been looking for"); else

showStatus("OK") ;

Обратим внимание на следующее. Receiver — это экземпляр (объект) класса Receiver, определенного в файле Receiver.java. Команда:

if (!(receiver instanceof Receiver))

как раз и проверяет, что receiver является экземпляром класса Receiver. Результаты проверки просто отображаются в виде информационной строки в поле статуса апплета командой show- status(). Если результат проверки положителен, то вслед за командой showStatus("OK"); выполняется "главная команда":

((Receiver) receiver).processRequest(returnValue());

Эта команда вызывает метод processRequest() из другого апплета и передает ему единственный параметр — результат выполнения метода returnVaiue(). Вызов варианта receiver.processRequest(returnValue()) принципиально не пройдет, так как Java будет считать в этом случае receiver классом или экземпляром класса, объявленного в данном файле или в одном из импортируемых файлов, но никак не в другом апплете. Так что следует запомнить и этот вариант вызова. Метод returnVaiue () не требует каких-либо дополнительных разъяснений. Рассмотрим теперь файл Receiver.java (листинг 2.7).

Листинг 2.7. Класс Receiver

import java.applet.*; import java.awt.*; import java.awt.event.*; import java.net.*;

public class Receiver extends Applet

private String receivedMsg="Red";

private Label label=new Label("zdem",Label.CENTER) public Button btnShow= new Button("HTML-page"); URL myurl=null;

String s;

public void init()

{

setLayout(null); add(label); add(btnShow);

label.setBounds(10,10,200,20);

btnShow.setBounds(10,50,80, 20) ; showStatus("init is working"); repaint(); try {

s="file:/C:/Program Files/bin/lab2.html"; myurl=new URL(s); label.setText(""+ myurl);

}

catch(MalformedURLException e)

{

showStatus("error of url"+e.getMessage()); label.setText("Badforurl");

}

}

public boolean action(Event evt,Object arg)

{

if (evt.target instanceof Button)

{

label.setText("changing url");

getAppletContext().showDocument(myurl,"_blank"); return (true) ;

return false;

}

public void paint(Graphics g)

{

g.drawString("Hello",20,50) ; if (receivedMsg.equals("Red"))

{

g.setColor(Color.red);

}

else

if (receivedMsg.equals("Blue"))

{

g.setColor(Color.blue);

}

else

g.setColor(Color.yellow); g.fillRect(0,0,getSize().width,getSize().height);

}

public void processRequest(String senderName)

{

label.setText(senderName); receivedMsg=senderName; repaint();}

}

Начнем с главного метода:

public void processRequest(String senderName)

{

label.setText(senderName);

receivedMsg=senderName; repaint();}

Данный метод отображает в текстовом поле iabei принятый текст из главного апплета, присваивает его переменной re- ceivedMsg и перерисовывает апплет с помощью команды re- paint(), вызывающей метод paint() апплета. Рассмотрим метод paint ():

public void paint(Graphics g)

{

g.drawString("Hello",20,50) ; if (receivedMsg.equals("Red"))

{

g.setColor(Color.red);

}

else

if (receivedMsg.equals("Blue"))

{

g.setColor(Color.blue);

}

else

g.setColor(Color.yellow); g.fillRect(0,0,getSize().width,getSize().height);

}

Изменение цвета апплета выполняет команда g.setcoior(), которая устанавливает цвет для заливки, а саму заливку выполняет команда g.fillRect(0,0,getSize() .width, getSize() .height), знакомая нам по первому практическому занятию. В заключение рассмотрим следующий метод:

public boolean action(Event evt, Object arg)

{

if (evt.target instanceof Button)

{

label.setText("changing url");

getAppletContext().showDocument(myurl,"_blank"); return (true) ;

return false;

}

Данный метод применяется для описания реакции на какоелибо событие от визуального компонента (например, кнопки). Также он использовался в начальных версиях Java и сохранен для совместимости, так как взамен используется метод action- Performed (). Подробно останавливаться на методе action() мы здесь не будем. Отметим, что параметр evt класса Event имеет ряд свойств, причем свойство target определяет объект, инициировавший событие. Другими важными свойствами параметра evt являются:

□      key — код клавиши для события от клавиатуры;

□      when — время происхождения события;

□      x,y — координаты курсора мыши при возникновении события;

□      id — идентификатор типа события (целое число).

Второй аргумент метода action позволяет конкретизировать объект, выдавший событие. Это делается, например, выполнением команды if (arg. equals ("SEND”) ) { . . . }. Метод equals () используется для проверки названия кнопки. Запомните, что в конце метода action() следует указать команду return false, если предполагается, что окончательная обработка событий не завершена в методе action(), или return true, если никакая дальнейшая обработка событий не предполагается. Иначе говоря, метод action () может обрабатывать только часть событий, остальные должны переадресовываться операционной системе.

Теперь остается последняя нерассмотренная команда обработчика action():

getAppletContext().showDocument(myurl,"_blank");

Эта команда отображает в окне документ с сетевым адресом myuri (обратите внимание, как он формируется в программе).

Второй параметр Ыапк указывает, что новый документ должен открываться в новом окне. Другие варианты:

□      parent — документ открывается в родительском окне;

□      top — документ открывается в верхней части окна браузера.

Итак, мы полностью рассмотрели вызов апплета из другого апплета С ПОМОЩЬЮ команды showDocument () .

Источник: Герман О. B., Герман Ю. О., Программирование на Java и C# для студента. — СПб.: БХВ-Петербург, 2005. — 512 c.: ил.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100