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

时间:2011-05-16 07:59:01

标签: java javascript jquery applet

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

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

enter image description here

现在我要做的是将这个文本从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(); }
}

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

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

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

我需要调用'getCurrentEditBoxText',但什么时候应该调用此方法'getCurrentEditBoxText'? 在我的情况下,当用户点击新的输入控件等时,我可能不得不这样做。

3 个答案:

答案 0 :(得分: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); 
}

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

import netscape.javascript.JSObject;

然后,在用于鼠标点击的任何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
}

每次调用该代码块时,都会更新文本。如果您无权访问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);
}

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

选项#2(未编码)

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

选项#3

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

答案 1 :(得分:4)

这是一个可能的解决方案。要在Java文本框中获取文本,请在Applet中编写getter方法以检索文本:

public class MyApplet extends JApplet {
  // ...
  public String getTextBoxText() { return myTextBox.getText(); }
}

在您的JQuery代码中,添加以下行:

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

我发现了here上面发布的大部分内容。希望这会有所帮助。

答案 2 :(得分:1)

This page解释了如何从Java applet中操作DOM。要查找input元素,只需调用document.getElementById(id)函数,其id为文本输入框的id属性。