我一直在使用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'? 在我的情况下,当用户点击新的输入控件等时,我可能不得不这样做。
答案 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属性。