我创建了一个Applet,我将从web项目的html页面访问applet方法。
这里的applet看起来像是:
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>
但是当我单击单选按钮时,我的浏览器会挂起,我无法访问applet方法。 我的applet类在默认目录中,html在WebContent文件夹中。 请告诉我我的代码应该有什么变化?
答案 0 :(得分:3)
问题是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);
}
}
答案 1 :(得分:2)
您在不同浏览器上遇到的问题是它们具有过时的LiveConnect(javascript&lt; - &gt; java)技术的不同实现。
根据经验,Firefox在尝试做这些事情时会更加合作。
您的问题是您尝试以非常古老的方式将小程序包含在页面中。虽然它可能并且将在某些浏览器上运行,但不建议将applet包含到页面中。
Java Web start是技术堆栈,JNLP是您可以用来以标准化方式分发Java内容的协议,如本文所述:
http://en.wikipedia.org/wiki/Java_Web_Start
部署jnlp描述符是您可以用来将applet嵌入页面的正确方法。此外,最好使用Sun的deployJava.js脚本,这样可以在将applet部署到页面上的容器时节省很多麻烦。 (它有点受限制,但随意添加东西)
http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html
总而言之,jnlp / Java web start powered applet是要走的路.Below是部署描述符的一个例子。
<?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>