如何在GWT中创建多个页面?

时间:2013-09-30 18:06:57

标签: java gwt

我有一个登录页面和主页面。登录后,我有

    public void onSuccess(String result) {
        // go to the next page
        SDM_Mailer page = new SDM_Mailer();
        RootPanel.get().remove(0);
        RootPanel.get().add(page);
    }

但RootPanel不接受EntryPoint对象! add()只接受一个Widget!好的,所以我扩展了Widget

  

public class SDM_Mailer extends Widget实现了EntryPoint {

但是现在当我尝试在GWT Designer中编辑SDM_Mailer时,它会出现这个错误:

Imgur

那么你究竟如何创建多个页面,这些页面并不都在同一个巨型类文件中或使用选项卡?我知道我以前做过这个,但是不记得和旧的版本。

4 个答案:

答案 0 :(得分:1)

您可以采用活动和地点

正如官方gwt project site所述:

  

“活动和地点”框架允许您在应用程序中创建可收藏的URL,从而允许浏览器的后退按钮和书签按用户的期望工作。

<强>活动

  

活动只是代表用户正在做的事情。活动不包含小部件或UI代码。

<强>放置

  

一个地方是表示UI特定状态的Java对象。地点可以转换为URL历史记录标记

来源:http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html

答案 1 :(得分:0)

您通常只有一个EntryPoint,您可以添加不同的小部件(可以代表不同的页面)并管理它们。

一个非常简单的方法是,小应用可以在代表页面的不同小部件上使用.setVisible(true)setVisible(false),但从长远来看,这不是一个好方法。 / p>

您还可以拥有一个容器小部件,您可以在其中添加要显示的小部件,然后当您想要在其中放置新小部件时清除它。

container.clear();
container.add(widget)

以上建议适用于小型应用,但当您的应用拥有大量网页(观看次数)时效果不佳。管理页面(视图)的一种流行方法是使用MVP Activities and Places。这是一个很大的开销,但可扩展,并且运行良好。

答案 2 :(得分:0)

扩展窗口小部件不会神奇地在HTML中创建可表示的内容。窗口小部件提供HTML中某些内容的图形表示,即将自身呈现为HTML的方式,这通过实现UIBinders来实现。我强烈建议您采用MVP方法并使用活动,地点和视图。检查official documentation如何做,这比你想象的要简单。

如果您正在使用Eclipse,the GWT plugin执行大部分样板操作。您可以观看this video如何使用它。

答案 3 :(得分:-2)

这就是我最终做的事情:

package com.example.client;

import java.util.logging.Logger;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.RootPanel;

public class Controller implements EntryPoint {
    private static Controller instance;
    private static final Logger log = Logger.getLogger(Controller.class.getName());

    // I have a feeling GWT does not respect private constructors, or else it uses some other voodoo.
    private Controller(){}

    public static Controller getInstance() {
        if (instance == null) instance = new Controller();
        return instance;
    }

    @Override
    public void onModuleLoad() {
        String token = History.getToken();
        log.info("****************************** token:"+token);
        History.addValueChangeHandler(new ValueChangeHandler<String>() {
            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                navigate(event.getValue());
            } // onValueChange
        });
        if (token == null || token.length() == 0) History.newItem(Login.TOKEN); // no token
        else navigate(token); // restore app state
    }

    private static void navigate(String token) {
        RootPanel rootPanel = RootPanel.get("gwtApp");
        if (rootPanel.getWidgetCount() > 0) rootPanel.remove(0); // clear the page

        if (Login.TOKEN.equals(token)) {
            Login page = Login.getInstance();
            page.onModuleLoad();
        } else if (MainApp.TOKEN.equals(token)) {
            MainApp page = MainApp.getInstance();
            page.onModuleLoad(); // display the page
//          page.setAuthenticated(true);
//          page.setUsername(email);
        }

    }

} // Controller

在* .gwt.xml文件中:

<entry-point class='com.example.client.Controller' /> 

现在,当您想要转到新页面时:

History.newItem(Login.TOKEN);

这看起来很熟悉,可能是几年前我提出来的。