在托管模式下启动 GWT 时,可以在小程序和 GWT 应用程序之间进行通信(反之亦然)?我认为不会,因为小程序只能与 JavaScript 通信(通过 LiveConnect),但 GWT 的托管模式不会产生任何 JS ......
1 回答
虽然托管模式在 jvm 中运行部分代码,但所有 jsni/dom/native 调用都委托给浏览器,因此在您的情况下应该没有任何区别,您可以调用 js 与您的小程序进行通信。当然,在同一个调试器会话中调试 gwt 和 applet 代码是不可能的。
要从 GWT 调用 applet 方法,您需要一个 jsni 块,例如:
private native Object callFoo(String param) /*-{
var appplet = document.getElementById('myapplet');
return applet.foo(param);
}-*/
要从您的小程序调用 GWT 代码,您需要另一个 jsni 方法来导出您的 gwt 代码(请注意,您必须在入口点调用一次)
private native void exportBar() /*-{
window.bar = function(param) {
return @com.examle.MyClass::myStaticMethod(*)(param);
}
}-*/
无论如何,我所知道的与小程序通信的最佳方法是使用gwtai,因为所需的所有样板代码(包装器和 jsni)都是自动生成的。
Gwtai,在托管模式下工作没有问题,虽然他们在他们的网站上说don't expect it to be stable
,它足够稳定,我已经在生产中使用了很长时间。
GwtAI 为 Google Web Toolkit (GWT) 项目提供了易于使用的跨浏览器 Java Applets 集成。GwtAI 包含许多实用程序和帮助类,例如自动创建包装小部件和与 Java Applet 通信的机制。
您需要下载两个文件(GwtAI-Client.jar 和 GwtAI-Core.jar )并包含在项目的类路径中,然后修改您的.ui.xml
文件以继承 gwtai,您就可以开始编码了。
首先,您必须在 gwt 代码中定义小程序接口,以便使用延迟绑定的 GWT 编译器创建通信类实现。
@ImplementingClass(MyClassImpl.class)
@Height("60") @Width("350") @Archive("GwtAI-Client.jar, MyApp.jar")
public interface MyApplet extends Applet {
public Object foo();
}
然后你必须在你的小程序代码中实现这个接口。
public class MyClassImpl extends JApplet implements MyApplet {
public Object foo(){
return "Hello";
}
}
最后使用 gwt 应用程序中的小程序
MyApplet applet = GWT.create(MyApplet.class);
Object foo = applet.foo();
阅读入门指南了解更多信息。