GWT模块和页面:每个主机页面加载两个模块并垂直显示它们

时间:2014-04-07 14:32:11

标签: java gwt module entry-point

问题简而言之:我有两个模块继承了一个公共模块(没有入口点),每个模块都有一个主机页面。无论加载哪个,它都会在页面上同时加载。 我只是想让他们分别加载和显示自己,而不是在所有页面中一起显示..

当我启动Login.html时,它启动这两个模块(它们垂直共享浏览器空间)并加载正确的入口点(Login extends Entrypoint)两次。

当我启动Main.html时,它会启动这两个模块,每个模块都带有主入口点......

我怀疑项目结构存在问题,但我们不想仅仅因为模块而将一个项目/应用程序分成几个项目。

登录

 <?xml version="1.0" encoding="UTF-8"?>
      <module rename-to='Login'>
      <inherits name='fqdn.Common' />
      <stylesheet src='../Common.css' />  
      <!-- Specify the app entry point class. -->
      <entry-point class='fqdn.Login' />
   <module>

主要

 <?xml version="1.0" encoding="UTF-8"?>
      <module rename-to='Main>
      <inherits name='fqdn.Common' />
      <stylesheet src='../Common.css' />  
      <!-- Specify the app entry point class. -->
      <entry-point class='fqdn.Main' />
    <module>

的login.html:

<html>
  <head>        
    <link type="text/css" rel="stylesheet" href="css/Common.css">
    <script type="text/javascript" language="javascript" src="Login/Login.nocache.js"></script>
  </head>
  <body>
    ...
  </body>
</html>

main.html中:

<html>
  <head>        
    <link type="text/css" rel="stylesheet" href="css/Common.css">
    <script type="text/javascript" language="javascript" src="Main/Main.nocache.js"></script>
  </head>
  <body>
    ...
  </body>
</html>

我必须承认,两个入口点共享相同的目录和许多类,但不是相同的Ginjector。 它们被命名为myproject.client.Login和myproject.client.Main。

这是GWT失败的原因吗?对于那种情况,我很高兴知道一个很好的修复或解决方法:)

更新:添加了Main.java代码段

public class Main implements EntryPoint {

    private Logger logger = Logger.getLogger(Main.class.getName());
    private final GinMainInjector injector = GinMainInjector.INSTANCE;
    private Place defaultPlace = GWT.create(TicketPlace.class);        
    private SimplePanel appWidget;
    private EventBus eventBus;

    public void onModuleLoad() {
            logger.finest("Starting Main...");
            eventBus = injector.getEventBus();                
            MainActivityMapper activityMapper = GWT.create(MainActivityMapper.class);
            activityMapper.insertInjector(injector);
            PlaceController placeController = injector.getPlaceController();
            createAppWidgetPanel();
            startActivityManager(activityMapper, eventBus);
            startHistoryHandler(placeController, eventBus);
    }

    private void startActivityManager(ActivityMapper activityMapper, EventBus eventBus) {
            ActivityManager activityManager = new ActivityManager(activityMapper, eventBus);
            activityManager.setDisplay(appWidget);
            RootLayoutPanel.get().clear();

            RootLayoutPanel.get().add(appWidget);
    }
}

2 个答案:

答案 0 :(得分:0)

如果您在同一屏幕上并排看到两个模块,这意味着您已将它们都添加到RootPanel中。更重要的是,这意味着您有一个VerticalPanel或类似于您的应用容器的东西 - 一个SimplePanel不会接受多个小部件,而其他面板将一个显示在另一个之上,或者一个在另一个之下。

检查Main.java和Login.java入口点中的代码。

答案 1 :(得分:0)

现在有效!

我们正在使用SuperDevMode,它混合了两个模块。 有关类似的答案,请参阅https://stackoverflow.com/a/20334018/2337633,可能会有更好的解释

我更改了代码服务器的参数,以便每个都加载模块,而不是一起加载

在:

 -src SRC package.Main package.Login

现在:

-src SRC package.Main -src SRC package.Login

注意:在这两种情况下,SRC都是同一目录。我不知道为什么以及这个参数列表如何工作,但每次当我在同一页面上看到两个模块时,我启动DevModeOn并根据url编译只是当前模块,然后再次工作。

如果我获得重定向并且其他模块启动,它可能会再次被破坏。但是再一次,DevModeOn用于那个模块并重新编译它 - 工作

这个问题(据我所知)只是使用带有错误参数的SuperDevMode的一个小问题。

另请注意,即使每个

替换整个RootLayoutPanel(html正文)也是如此
RootLayoutPanel.get().clear();
RootLayoutPanel.get().add(appWidget);

问题坚持留下来。 我真的认为这只是CodeServer参数和重新编译mashup。