Java小程序和网页上的文本输入控件之间的桥接

我一直在使用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(); } } 

在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’? 就我而言,当用户点击新的输入控件等时,我可能不得不这样做。

您可以在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和我上面post的组合,可以在你完成applet时设置文本字段的值。

这是一个可能的解决方案。 要在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 

我发现了上面发布的大部分内容。 希望这可以帮助。

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