Доступ к полям аплета Java из сценария JavaScript
В предыдущем примере сценарий JavaScript вызывал методы, определенные в аплете Java. В следующем примере сценарий будет обращаться к полю, определенному в главном классе аплета.
Заметим, что сценарию JavaScript доступны только те поля и методы аплета, определенные как public.
На рис. 6.2 показан внешний вид документа HTML, в котором расположен один аплет и форма с одним многострочным текстовым полем и одной кнопкой.

Рис. 6.2. Сценарий JavaScript вызывает получает информацию от аплета
В окне аплета, расположенном в верхней части документа, находится поле редактирования текста и кнопка с надписью “Получить строку”. Если набрать в поле редактирования любую текстовую строку и нажать эту кнопку, то введенная строка будет отображена в нижней части аплета после символа >. Такой аплет мы описали в 30 томе “Библиотеки системного программиста” в разделе “Приложение TxtField” пятой главы.
Если нажать кнопку “Get applet info and text”, то сценарий JavaScript извлечет из аплета введенную текстовую строку (она хранится в поле с именем str), а также получит описание аплета, вызвав метод getAppletInfo, определенный в нашем аплете.
Введенная строка и информация об аплете будет затем отображена сценарием в многострочном поле редактирования, как это показано на рис.6.2.
Таким образом, наш сценарий обращается к полю и методу, определенным в аплете.
Исходный текст документа HTML вы найдете в листинге 6.3.
Листинг 6.3. Файл chapter6/TxtField/TxtField.html
<HTML>
<HEAD>
<TITLE>Get text</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function getTextFromApplet()
{
var szMsg="null";
GetForm.Comment.value = document.applets[0].str +
"\n" + "---------------------------\n" +
document.applets[0].getAppletInfo();
}
// -->
</SCRIPT>
</HEAD>
<BODY>
<HR>
<APPLET
CODE=TxtField.class
NAME="TxtField"
ID=TxtField
WIDTH=320
HEIGHT=140>
</APPLET>
<HR>
<FORM NAME="GetForm">
<P><TEXTAREA NAME="Comment"
ROWS="7" COLS="45">
</TEXTAREA>
<P>
<INPUT TYPE="button" VALUE=" Get applet info and text" onClick="getTextFromApplet();">
</FORM>
<A HREF="TxtField.java">The source.</a>
</BODY>
</HTML>
Для кнопки, расположенной в форме с именем GetForm, мы определили обработчик события onClick:
onClick="getTextFromApplet();"
Этот обработчик вызывает функцию getTextFromApplet, выполняющую взаимодействие с аплетом.
Функция getTextFromApplet обращается к аплету как к самому первому элементу массива document.applets[0]:
GetForm.Comment.value = document.applets[0].str +
"\n" + "---------------------------\n" +
document.applets[0].getAppletInfo();
Здесь мы записываем в свойство value многострочного поля GetForm.Comment значение переменной str, к которому добавлен разделитель из символов “-“ и строка описания аплета, полученная от метода getAppletInfo.
Исходный текст аплета приведен в листинге 6.4.
Листинг 6.4. Файл chapter6/TxtField/TxtField.java
// =========================================================
// Однострочное текстовое поле класса TextField
//
// (C) Фролов А.В, 1997, 1998
//
// E-mail: frolov@glas.apc.org
// WWW: http://www.glasnet.ru/~frolov
// или
// http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;
public class TxtField extends Applet
{
// Создаем ссылку на объекты типа TextField
TextField txt;
// Создаем ссылку на объекты типа Button
Button btnGetText;
// Строка для хранения введенных данных
public String str;
// -------------------------------------------------------
// getAppletInfo
// Метод, возвращающей строку информации об аплете
// -------------------------------------------------------
public String getAppletInfo()
{
return "Name: TxtField\r\n" +
"Author: Alexandr Frolov\r\n" +
"E-mail: frolov@glas.apc.org\r\n" +
"WWW: http://www.glasnet.ru/~frolov\r\n" +
"Created with Microsoft Visual J++ Version 1.0";
}
// -------------------------------------------------------
// init
// Метод, получающий управление при инициализации аплета
// -------------------------------------------------------
public void init()
{
// Создаем редактируемое однострочное текстовое поле
txt = new TextField("Введите строку текста", 35);
// Создаем кнопку, с помощью которой можно получить
// содержимое текстового поля
btnGetText = new Button("Получить строку");
// Добавляем текстовое поле в окно аплете
add(txt);
// Добавляем кнопку в окно аплете
add(btnGetText);
// Получаем и сохраняем текущий текст,
// установленный в поле
str = txt.getText();
// Устанавливаем цвет фона
setBackground(Color.yellow);
}
// -------------------------------------------------------
// action
// Метод вызывается, когда пользователь выполняет
// действие над компонентами
// -------------------------------------------------------
public boolean action(Event evt, Object obj)
{
// Ссылка на кнопку, от которой пришло сообщение
Button btn;
// Проверяем, что событие вызвано кнопкой, а не
// другим компонентом
if(evt.target instanceof Button)
{
// Получам ссылку на кнопку, вызвавшую событие
btn = (Button)evt.target;
// Проверяем ссылку на кнопку
if(evt.target.equals(btnGetText))
{
// Получаем и сохраняем текущий текст,
// установленный в поле
str = txt.getText();
// Перерисовываем окно аплета
repaint();
}
// Если событие возникло от неизвестной кнопки,
// мы его не обрабатываем
else
{
return false;
}
// Возвращаем признак того, что мы обработали событие
return true;
}
// Если событие вызвано не кнопкой,
// мы его не обрабатываем
return false;
}
// -------------------------------------------------------
// paint
// Метод paint, выполняющий рисование в окне аплета
// -------------------------------------------------------
public void paint(Graphics g)
{
// Определяем текущие размеры окна аплета
Dimension dimAppWndDimension = size();
// Выбираем в контекст отображения черный цвет
g.setColor(Color.black);
// Рисуем рамку вокруг окна аплета
g.drawRect(0, 0,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1);
// Рисуем строку, полученную из текстового поля
g.drawString("> " + str, 10, 100);
}
}
Этот текст воспроизведен нами с небольшими изменениями из 30 тома “Библиотеки системного программиста”. Изменения заключаются в том, что мы добавили к определению поля str ключевое слово public:
public String str;
Это необходимо для того чтобы поле str было доступно из сценария JavaScript.