我有一个登录页面和主页面。登录后,我有
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时,它会出现这个错误:
那么你究竟如何创建多个页面,这些页面并不都在同一个巨型类文件中或使用选项卡?我知道我以前做过这个,但是不记得和旧的版本。
答案 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);
这看起来很熟悉,可能是几年前我提出来的。