0

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

    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 时,它给出了这个错误:

伊姆古尔

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

4

4 回答 4

1

您可以采用活动和地点

正如官方gwt 项目网站所述:

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

活动

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

地方

位置是表示 UI 特定状态的 Java 对象。可以将地点转换为 URL 历史标记和从 URL 历史标记转换而来

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

于 2013-10-01T09:38:20.093 回答
0

扩展 Widget 并不会神奇地使某些东西在 HTML 中可表示。小部件在 HTML 中提供了某些东西的图形表示,也就是说,一种将自己呈现为 HTML 的方式,这通常通过实现UIBinders来实现。我强烈建议您采用 MVP 方法并使用活动、地点和视图。查看官方文档以了解如何操作,它比您想象的要简单。

如果您使用 Eclipse,GWT 插件会完成大部分样板文件。您可以观看此视频,了解如何使用它。

于 2013-10-01T12:47:27.130 回答
0

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

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

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

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

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

于 2013-09-30T19:06:27.390 回答
-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);

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

于 2013-10-04T21:36:43.197 回答