如何从 JavaScript 调用小程序方法

How to call an applet method from JavaScript

本文关键字:程序 方法 调用 JavaScript      更新时间:2023-09-26

我已经创建了一个小程序,我将从Web项目的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 文件夹中。我应该在代码中更改什么?

问题是if语句检查:

document.CityChoice.City[0].checked == true

这与 JavaScript 并不完全一样,因为您那里的错误表达式会抛出错误,并且它永远不会进入 if 语句正文。

我删除了 if 语句并将代码更改为如下所示:

function selectedCity()
{
    document.SimpleMessageApplet.setMessage("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 内容的协议,如本文所示:

Java Web start

部署 JNLP 描述符是将小程序嵌入页面的正确方法。此外,使用 Sun 的 deployJava.js 脚本是个好主意,这将在将小程序部署到页面上的容器时为您省去很多麻烦(虽然它有点限制,所以请随意添加内容(。

Java™ 富互联网应用程序部署建议

总而言之,JNLP/Java Web 启动驱动的小程序是要走的路。下面是部署描述符的示例。

<?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>