繁体   English   中英

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

[英]How do you create multiple pages in 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

公共类SDM_Mailer扩展了Widget实现EntryPoint {

但是现在,当我尝试在GWT设计器中编辑SDM_Mailer时,出现了以下错误:

伊姆古尔

那么,究竟如何创建多个页面,而不是全部都在同一个巨型类文件中或使用制表符呢? 我知道我以前曾经做过,但是不记得使用旧版本了。

您可以采用“ 活动和地点”

如官方gwt项目站点所述

通过“活动和地点”框架,您可以在应用程序内创建可添加书签的URL,从而使浏览器的后退按钮和书签可以按用户期望的方式工作。

活动

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

地点

位置是表示UI特定状态的Java对象。 位置可以与URL历史记录令牌进行相互转换

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

通常,从那里只有一个EntryPoint ,然后添加不同的小部件(可以代表您的不同页面)并进行管理。

对于小型应用程序,执行此操作的一种非常简单的方法是在代表页面的不同小部件上使用.setVisible(true)setVisible(false) ,但从长远来看,这不是一个好方法。

您还可以有一个容器窗口小部件,您可以在其中添加要显示的任何窗口小部件,然后在要放置新的窗口小部件时将其清除。

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

上面的建议对于小型应用程序是可以的,但是当您的应用程序具有很多页面(视图)时,这些建议就不好用。 管理页面(视图)的一种流行方法是使用MVP活动和位置 它的开销很大,但可扩展且效果很好。

扩展小部件并不能神奇地使某些东西在HTML中可表示。 窗口小部件以HTML形式提供某种事物的图形表示,即一种将自身呈现为HTML的方式,这通常是通过实现UIBinders来实现的。 我强烈建议您采用MVP方法,并使用“活动”,“地点”和“视图”。 查看官方文档中的操作方法,它比您想象的要简单。

如果您使用的是Eclipse, 则GWT插件将完成大部分样板工作。 您可以观看此视频 ,了解如何使用它。

这就是我最终要做的事情:

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);

这似乎很熟悉,可能是几年前我想到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM