0

在托管模式下启动 GWT 时,可以在小程序和 GWT 应用程序之间进行通信(反之亦然)?我认为不会,因为小程序只能与 JavaScript 通信(通过 LiveConnect),但 GWT 的托管模式不会产生任何 JS ......

4

1 回答 1

2

虽然托管模式在 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();

阅读入门指南了解更多信息。

于 2013-04-06T17:48:54.880 回答