Как вызвать метод апплета из JavaScript
Я создал апплет, и я собираюсь получить доступ к методу апплета из моей HTML-страницы в веб-проекте.
Здесь мой апплет выглядит так:
public class MessageApplet extends Applet {
private Label m_mess;
public void init()
{
setBackground(Color.lightGray);
setLayout(new BorderLayout());
m_mess = new Label("MessageApplet is Running... : No Selection Yet", Label.CENTER);
add(BorderLayout.CENTER, m_mess);
}
public void setMessage(String message)
{
m_mess.setText("Selection : " + message);
}
}
И моя HTML-страница выглядит так:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<SCRIPT LANGUAGE="JavaScript">
function selectedCity()
{
if(document.CityChoice.City[0].checked == true)
{
document.SimpleMessageApplet.setMessage(document.CityChoice.City[0].value);
}
}
</SCRIPT></HEAD>
<BODY >
<b>This is the Applet</b>
<APPLET CODE="MessageApplet.class" NAME="SimpleMessageApplet" WIDTH=350 HEIGHT=100 >
</APPLET >
<FORM NAME="CityChoice">
<input type="radio" name="City" value="Boston" onClick="selectedCity()"> Boston<br>
</form>
</BODY >
</html>
но когда я нажимаю переключатель, мой браузер зависает, и я не могу получить доступ к методу апплета. Мой класс апплета находится в каталоге по умолчанию, а html - в папке WebContent. Пожалуйста, скажите мне, что я должен изменить в своем коде?
2 ответа
Проблема в проверке оператора IF:
document.CityChoice.City[0].checked == true
Это не совсем то, что происходит с Javascript, поскольку неправильное выражение, которое у вас там, выдает ошибку, и оно никогда не попадает в тело оператора IF.
Я удалил оператор IF и изменил код на что-то вроде этого:
function selectedCity()
{
document.SimpleMessageApplet.setMessage("Hello");
}
Когда я нажимаю, я вижу сообщение Hello.
Измените содержимое вашего HTML-файла на что-то вроде:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<SCRIPT LANGUAGE="JavaScript">
function selectedCity()
{
var elem = document.getElementById('cityRb');
if(elem.checked)
{
document.SimpleMessageApplet.setMessage(elem.value);
}
}
</SCRIPT></HEAD>
<BODY >
<b>This is the Applet</b>
<APPLET CODE="MessageApplet.class" NAME="SimpleMessageApplet" WIDTH=350 HEIGHT=100 >
</APPLET >
<FORM NAME="CityChoice">
<input type="radio" id="cityRb" name="City" value="Boston" onClick="selectedCity()"> Boston<br>
</form>
</BODY >
</html>
Также добавляем полный код класса:
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Label;
/**
*
* @author hmmmmm
*/
public class MessageApplet extends Applet {
private Label m_mess;
public void init() {
setBackground(Color.lightGray);
setLayout(new BorderLayout());
m_mess = new Label("MessageApplet is Running... : No Selection Yet", Label.CENTER);
add(BorderLayout.CENTER, m_mess);
m_mess.setBackground(Color.red);
}
public void setMessage(String message) {
m_mess.setText("Selection : " + message);
}
}
Проблема, которую вы получаете в разных браузерах, состоит в том, что они имеют разные реализации устаревшей технологии LiveConnect (javascript<->java).
Как правило, Firefox будет более охотно сотрудничать при попытках делать такие вещи.
Ваша проблема в том, что вы пытаетесь добавить свой апплет на страницу очень древним способом. Хотя это может работать и будет работать в некоторых браузерах, это не рекомендуемый способ добавления апплета на страницу.
Java Web start - это технологический стек, а JNLP - это протокол, который вы можете использовать для стандартного распространения контента Java, как вы можете прочитать в этой статье:
http://en.wikipedia.org/wiki/Java_Web_Start
Дескриптор jnlp развертывания - это правильный способ, которым вы можете использовать для встраивания вашего апплета на страницу. Кроме того, рекомендуется использовать сценарий Sun deployJava.js, который избавит вас от многих проблем при развертывании апплета в контейнере на странице. (это немного ограничено, так что не стесняйтесь добавлять что-то к нему)
http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html
В общем и целом, апплет для запуска через веб-интерфейс jnlp / Java - это путь. Ниже приведен пример дескриптора развертывания.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jnlp codebase="file:/C:/JavaApplication6/dist/" href="launch.jnlp" spec="1.0+">
<information>
<title>JavaApplication6</title>
<description>blalbla</description>
<description kind="short">JavaApplication6</description>
</information>
<update check="background"/>
<security>
<all-permissions/>
</security>
<resources>
<j2se java-vm-args="-Djava.security.policy=applet.policy" version="1.5+"/>
<jar href="JavaApplication6.jar" main="true"/>
<jar href="lib/jna.jar"/>
<jar href="lib/platform.jar"/>
</resources>
<applet-desc height="300" main-class="winToJnaApi.NewApplet" name="JavaApplication6" width="300">
</applet-desc>
</jnlp>