如何在GWT中传递两个模块

时间:2013-06-24 10:45:20

标签: java gwt jsni gwtquery gwt-exporter

我在gwt应用程序中创建了两个模块名称module1和module2。我想在几秒钟后同时将消息从module1传递到module2,同时将module2传递给module1。     我编写了以下代码,但它让我无法在类路径中找到module1.gwt.xml。

        public void onModuleLoad() {
                mainBus.fireEvent(new PingEvent("-----Simulation Started-----"));
        }

        module1

        public void onModuleLoad() 
            {
                GWTEventBus.mainBus.addHandler(PingEvent.TYPE, new PingEventHandler(){
                    public void onEvent(PingEvent event) {
                        System.out.print("Inside Ping --> ");
                        new Timer(){
                            public void run() {
                                GWTEventBus.mainBus.fireEvent(new PongEvent("Pong fired..."));
                            }
                        }.schedule(1000);
                    }
                });


            }
        module2
        public void onModuleLoad() 
            {
                //final SimpleEventBus mainBus = new SimpleEventBus();
                GWTEventBus.mainBus.addHandler(PongEvent.TYPE, new PongEventHandler(){
                    public void onEvent(PongEvent event) {
                        System.out.print("Inside Pong1 --> ");
                        new Timer(){
                            public void run() {
                                GWTEventBus.mainBus.fireEvent(new PingEvent("Ping fired..."));
                            }
                        }.schedule(1000);
                    }
                });


            }

    plz help me.

2 个答案:

答案 0 :(得分:2)

如果您尝试在同一网页中包含两个独立的模块(* .nocache.js文件),除非使用JS,否则无法传递消息。

使用JSNI从module1导出一些方法,以便在javascript中可用,然后使用JSNI从module2调用此方法。

package my.package.module1;
public class MyClass1 implements EntryPoint {
  public void onModuleLoad() {
    exportMyJavaMethod();
  }
  public static String myJavaMethod(String message) {
    // Do whatever with the message received (create an event, etc.)
    return "Hello " + message;
  }
  private native static exportMyJavaMethod() /*-{
    $wnd.myJavaMethod = @my.package.module1.MyClass1::myJavaMethod;
  }-*/;
}


package my.package.module2;
public class MyClass2 implements EntryPoint {
  public void onModuleLoad() {
    String ret = callMyJavaMethod("foo");
  }
  private native static callMyJavaMethod(String s) /*-{
    return $wnd.myJavaMethod(s);
  }-*/;
}

请注意,使用JSNI,您必须根据基元类型传递消息(请参阅documentation

BTW:我宁愿使用gwtexporter来导出JS中我想要的方法和类,而使用gwtquery来调用JS方法而不是使用JSNI。

答案 1 :(得分:0)

您的应用只能有一个入口点,但您可以让主模块继承多个其他gwt应用。我建议调查模块继承。您可以继承.gwt.xml文件中的模块,并且将加载该模块,并自动调用其onModuleLoad方法。

https://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects#DevGuideModules