Java applet与网页上的文本输入控件之间的桥接

Cip*_*her 9 javascript java jquery applet

我一直在使用Java applet,这是一个小程序,可以帮助只使用鼠标编写.对于我的情况,我试图将其合并到我的网站项目中,如下所示:

当用户单击页面上的任何输入元素(textbox/textarea)时,此JAVA小程序将加载到网页本身.在下面看到的JAVA applet的屏幕截图中,用户指向一个字母表,相应的文本将写入applet的文本框中.

在此输入图像描述

现在我要做的是将这个文本从applet的TextBox传递到网页上的input元素.我知道这需要Java和JavaScript之间的交互,但不是专业人士,我真的没有抓住.这是Java applet和我编写的代码.

Java applet和jQuery代码(298kB):http://bit.ly/jItN9m

请大家帮忙扩展这段代码.非常感谢!

更新

我在某个地方搜索并发现了这个 - >要获取Java文本框内的文本,在Applet中使用getter方法来检索文本:

public class MyApplet extends JApplet {
  // ...
  public String getTextBoxText() { return myTextBox.getText(); }
}
Run Code Online (Sandbox Code Playgroud)

在JQuery代码中,我想要添加以下行:

var textBoxText = $("#applet-id")[0].getTextBoxText();
//Now do something with the text
Run Code Online (Sandbox Code Playgroud)

对于applet的代码,我在这里看到了一个GNOME git页面.getText调用已存在 - 请查看此文件的底部:http://git.gnome.org/browse/dasher/tree/java/dasher/applet/JDasherApplet.java

我需要调用'getCurrentEditBoxText',但什么时候应该调用这个方法'getCurrentEditBoxText'?就我而言,当用户点击新的输入控件等时,我可能不得不这样做.

jbr*_*ver 8

您可以在Applet和页面上的任何javascript方法之间进行完全通信.Kyle有一个很好的帖子,演示了Javascript如何调用applet并请求文本值.但是,我认为您希望每次单击鼠标都能更新HTML Textfield,这意味着applet需要与页面进行通信.我会修改你的javascript到这样的:

var activeTextArea = null;

$('textarea, input').click(function() {
    $(this).dasher();
    activeTextArea = this;
}); 

function updateText(text) {
     // Careful: I think textarea and input have different 
     // methods for setting the value. Check the 
     // jQuery documentation
     $(activeTextArea).val(text); 
}
Run Code Online (Sandbox Code Playgroud)

假设您拥有applet的源代码,您可以让它与上面的javascript函数进行通信.添加此导入:

import netscape.javascript.JSObject;
Run Code Online (Sandbox Code Playgroud)

然后,在用于鼠标单击的任何onClick处理程序中,添加:

// After the Applet Text has been updated
JSObject win = null;
try {
    win = (JSObject) JSObject.getWindow(Applet.this);
    win.call("updateText", new Object[] { textBox.getText() });
} catch (Exception ex) {
    // oops
}
Run Code Online (Sandbox Code Playgroud)

这将在每次调用代码块时更新文本.如果您无权访问applet源,事情会变得棘手.您需要设置某种javascript超时方式,不断从applet中读取值,但这假设applet具有返回文本框值的方法.

另请参阅:http://java.sun.com/products/plugin/1.3/docs/jsobject.html

更新修改小程序是您最好的镜头,因为这是任何事件将被触发的地方.例如,如果您希望HTML TextField在每次单击时都更改,则单击会在applet中发生,需要修改该单击以触发更新,如上所述.在不修改applet的情况下,我看到了两个选项.选项#1使用计时器:

var timer;
var activeTextArea;

$('textarea, input').click(function() {
    $(this).dasher();
    activeTextArea = this;
    updateText();
} 

function updateText() {
    // Same warnings about textarea vs. input
    $(activeTextArea).val($('#appletId')[0].getCurrentEditBoxText());
    timer = setTimeout("updateText()", 50);
}

function stopUpdating() {
    clearTimeout(timer);
}
Run Code Online (Sandbox Code Playgroud)

这类似于上面的代码,除了单击文本区域触发循环函数updateText(),该函数将每隔50ms将HTML文本字段的值设置为Applet文本字段的值.这可能会在点击和更新之间引入一个小的延迟,但它会很小.您可以增加定时器频率,但这会增加性能消耗.我没有看到你'隐藏'applet的位置,但是应该调用相同的函数,stopUpdating以便我们不再尝试联系隐藏的applet.

选项#2(未编码)

我将尝试捕获Applet中的点击,因为它在HTML Dom中冒泡.然后,您可以跳过计时器并click()在Applet容器上放置一个行为来执行相同的更新.我不确定这些事件是否会冒泡,所以不确定这是否会起作用.即使它确实如此,我也不确定它与浏览器的兼容性如何.

选项#3

第三个选项是不在每次点击时更新HTML文本字段.这只是Kyle和我上面帖子的组合,可以在你完成applet时设置文本字段的值.