Java:如何在更改位置时显示/隐藏web应用程序中的工作指示器?
我正在寻找一种在我的web应用程序中显示和隐藏工作指示器的方法。我将GWT与模型视图演示者模式一起使用,并为不同的页面和活动提供了位置,这些页面和活动是我的演示者对象 到目前为止,我尝试的是: 视图对象必须实现Java:如何在更改位置时显示/隐藏web应用程序中的工作指示器?,java,gwt,web-applications,Java,Gwt,Web Applications,我正在寻找一种在我的web应用程序中显示和隐藏工作指示器的方法。我将GWT与模型视图演示者模式一起使用,并为不同的页面和活动提供了位置,这些页面和活动是我的演示者对象 到目前为止,我尝试的是: 视图对象必须实现 public interface HasWorkingIndicator void showWorkingIndicator(boolean show); 活动对象在开始方法中对其视图对象调用showWorkingIndicator @Override publ
public interface HasWorkingIndicator
void showWorkingIndicator(boolean show);
活动对象在开始方法中对其视图对象调用showWorkingIndicator
@Override
public void start(final AcceptsOneWidget panel, EventBus eventBus){
page.showWorkingIndicator(true);
//more code...
}
那么,隐藏WorkingIndicator视图的最佳方法是什么?我不能在start()的末尾调用showWorkingIndicator(false),因为当时没有设置页面。
可能有什么模式可以看吗?如果您正在使用活动,这将成为一项非常容易完成的任务 我有一个实现活动的AbstractActivity,它处理诸如clientfactory和父面板之类的事情 活动接口实现了mayStop()、onStop和onStart等
public class WorkingIndicator extends Composite {
private static WorkingIndicator instance = null;
private WorkingIndicator(){
initWidget(new Label("Working"));
}
public static WorkingIndicator getInstance() {
if (instance == null) {
instance = new WorkingIndicator();
}
return instance;
}
public void show() {
RootLayoutPanel.get().add(this);
}
public void hide() {
RootLayoutPanel.get().remove(this);
}
}
这个活动看起来像这样
public abstract class AbstractActivity<T extends ApplicationPlace, V extends View> implements Activity {
protected ClientFactory clientFactory;
protected EventBus eventBus;
protected AcceptsOneWidget parentPanel;
protected final T place;
protected final V display;
protected final List<HandlerRegistration> handlers = new ArrayList<HandlerRegistration>();
public AbstractActivity(T place, ClientFactory clientFactory, V display) {
this.place = place;
this.clientFactory = clientFactory;
this.display = display;
}
protected void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
}
protected EventBus getEventBus() {
return this.eventBus;
}
@Override
public void start(AcceptsOneWidget parentPanel, EventBus eventBus) {
this.parentPanel = parentPanel;
this.eventBus = eventBus;
parentPanel.setWidget(display.asWidget());
bindToView();
WorkingIndicator.getInstance().hide();
}
public AcceptsOneWidget getParentPanel() {
return parentPanel;
}
public T getPlace() {
return place;
}
public V getDisplay() {
return display;
}
public ClientFactory getClientFactory() {
return clientFactory;
}
/**
* Shortcut getter for the CSS style in Resources.
*
* @return
*/
public Style style() {
return clientFactory.getResources().style();
}
@Override
public String mayStop() {
return null;
}
@Override
public void onCancel() {
}
@Override
public void onStop() {
cleanup();
display.reset();
WorkingIndicator.getInstance().show();
}
protected void addHandler(HandlerRegistration registration) {
handlers.add(registration);
}
public List<HandlerRegistration> getHandlers() {
return handlers;
}
protected void cleanup() {
for (HandlerRegistration handler : handlers) {
handler.removeHandler();
}
}
/**
* This function will be called immediately after adding the view to the
* DOM. This function should be used to hook up click handlers, populate
* HasData handlers and such.
*/
protected abstract void bindToView();
protected DaoRequestFactory daoRequestFactory() {
return clientFactory.daoRequestFactory();
}
protected AnalyticsTaskRequest analyticsTaskRequest() {
return clientFactory.daoRequestFactory().analyticsTaskRequest();
}
protected EventBus eventBus() {
return clientFactory.getEventBus();
}
protected PersonProxy currentPerson() {
return clientFactory.getCurrentPerson();
}
}
公共抽象类AbstractActivity实现活动{
受保护的客户工厂客户工厂;
受保护的事件总线事件总线;
受保护的AcceptsOneWidget父面板;
受保护的最终场所;
受保护的最终V型显示器;
受保护的最终列表处理程序=新的ArrayList();
公共抽象活动(T场所、ClientFactory ClientFactory、V显示){
这个地方=地方;
this.clientFactory=clientFactory;
this.display=显示;
}
受保护的void setEventBus(EventBus EventBus){
this.eventBus=eventBus;
}
受保护的EventBus getEventBus(){
返回此.eventBus;
}
@凌驾
公共无效启动(AcceptsOneWidget父面板,EventBus EventBus){
this.parentPanel=parentPanel;
this.eventBus=eventBus;
parentPanel.setWidget(display.asWidget());
bindToView();
WorkingIndicator.getInstance().hide();
}
public AcceptsOneWidget getParentPanel(){
返回父面板;
}
公共场所{
返回地点;
}
公共V getDisplay(){
返回显示;
}
公共客户端工厂getClientFactory(){
返回客户工厂;
}
/**
*参考资料中CSS样式的快捷方式获取程序。
*
*@返回
*/
公共风格(){
返回clientFactory.getResources().style();
}
@凌驾
公共字符串mayStop(){
返回null;
}
@凌驾
公开作废{
}
@凌驾
公共void onStop(){
清理();
display.reset();
WorkingIndicator.getInstance().show();
}
受保护的无效addHandler(HandlerRegistration){
添加(注册);
}
公共列表getHandlers(){
返回处理程序;
}
受保护的空清除(){
for(HandlerRegistration处理程序:处理程序){
removeHandler();
}
}
/**
*将视图添加到视图后,将立即调用此函数
*此函数应用于连接单击处理程序、填充
*HasData处理程序等等。
*/
受保护的抽象void bindToView();
受保护的DaoRequestFactory DaoRequestFactory(){
返回clientFactory.daoRequestFactory();
}
受保护的AnalyticsTaskRequest AnalyticsTaskRequest(){
返回clientFactory.daoRequestFactory().AnalyticStataskRequest();
}
受保护的EventBus EventBus(){
返回clientFactory.getEventBus();
}
受保护的个人Proxy currentPerson(){
return clientFactory.getCurrentPerson();
}
}
这取决于您希望如何/在何处/何时显示指示器
如果目标是在活动的位置显示它,那么您有两个选择:在视图中处理它,或者在传递给活动的start()
的AcceptsOnWidget
上调用两次setWidget
:一次使用等待指示器小部件,然后使用真实活动的视图。如果可以保证给定显示区域始终存在活动,则也可以在
AcceptsOneWidget
实现中烘焙该活动:当使用null
调用setWidget
时,显示等待指示器(类似的技巧是使用IsWidget
,其asWidget
返回null
,而不是活动的start
中的等待指示器小部件)
但是,如果您可以使用全局指示符,那么您可以使用
NotificationMole
或类似的小部件,并根据挂起的RPC/RequestFactory调用和/或您将从活动在事件总线上发送的事件触发其显示。位置会立即更改。我假设您希望在(a)时显示指示符视图是第一次构造的,或者(B)在显示视图之前等待数据从服务器到达
在任何一种情况下,您都需要向视图添加一个标志,例如isInitialized(),以告知活动是否需要执行某些操作来构建视图(如创建数据网格、填充树等),或者该视图之前已构建,因此可以跳过此步骤
当您的活动开始时,检查视图是否已初始化。如果未初始化,则显示加载指示器。我建议使用一个简单的PopupPanel,并启用一个玻璃来阻止UI。当活动完成构建视图/加载数据时,它应在视图中设置标志(例如setInitialize(),然后隐藏此弹出面板。我认为singleton Workinginator类可能是从视图中显示/隐藏面板的最佳方式,这样它就不会超出范围。要理解您的方法,您必须使用binToView()因为您的workingIndicator是一个单例,它将在您的子类活动中的视图上显示/隐藏workingIndicator,对吗?bindToView只是因为我有许多活动一遍又一遍地共享同一代码。这为我不使用