Java小程序与网页文本输入控件之间的桥梁

9
我一直在使用一个Java小程序,这是一个可以用鼠标来书写的小程序。对于我的情况,我正在尝试将其整合到我的网站项目中,具体如下: 当用户单击页面上的任何输入元素(文本框/文本区域)时,该JAVA小程序会加载到网页本身上。在下面所示的JAVA小程序截图中,用户指向一个字母,相应的文本会被写入小程序的文本框中。

enter image description here

现在我想做的是从applet的文本框中获取文本并将其传递到网页上的输入元素。我知道这需要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

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

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

3个回答

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); 
}

假设您有小程序的源代码,您可以让它与上述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
}
每次调用代码块时,都会更新文本。如果您无法访问小程序源代码,则需要设置某种JavaScript超时,不断从小程序读取值,但这假定小程序具有返回文本框值的方法。 另请参见:http://java.sun.com/products/plugin/1.3/docs/jsobject.html 更新 修改小程序是最好的选择,因为任何事件都会在那里触发。例如,如果您希望HTML TextField在每次单击时更改,则单击发生在小程序中,需要修改小程序以触发更新,如上所述。如果不修改小程序,则我看到两个选项。选项#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和我上面的帖子组合起来,以在您“完成”Applet时设置文本字段的值。

嗨,jrookover。感谢您详细的回答。看到您的帖子后,我更新了我的问题,提供了更多有关小程序代码和一些发现的信息。如果您能在这个阶段推荐所需的jQuery文件更改,那将是非常支持的。 - Cipher
现在正在工作,但我稍后会发布更新。它可能会与我建议的JavaScript超时一起使用。唯一的问题是响应性(即不断地获取更新)和性能(即不断地获取更新会消耗资源)之间存在平衡。最好的实现方式是修改Applet代码以响应单击事件。虽然我想知道这样的事件是否会通过DOM冒泡? - jbrookover
@jbrookover:我可以给您发电子邮件询问这些问题吗?已经卡了很长时间了。只需要一点帮助,谢谢。:-| - Cipher
当然可以,但那就是我知道的极限了。 - jbrookover
@jbrookover:通过上述查询,我还想问一下你的电子邮件地址 :-p - Cipher

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

我在这里找到了大部分我上面发布的内容。希望这可以帮助你。


1

这个页面解释了如何从Java applet中操作DOM。要找到输入元素,只需使用文档的getElementById(id)函数,并将其id设置为文本输入框的id属性之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,