Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何在更改位置时显示/隐藏web应用程序中的工作指示器?_Java_Gwt_Web Applications - Fatal编程技术网

Java:如何在更改位置时显示/隐藏web应用程序中的工作指示器?

Java:如何在更改位置时显示/隐藏web应用程序中的工作指示器?,java,gwt,web-applications,Java,Gwt,Web Applications,我正在寻找一种在我的web应用程序中显示和隐藏工作指示器的方法。我将GWT与模型视图演示者模式一起使用,并为不同的页面和活动提供了位置,这些页面和活动是我的演示者对象 到目前为止,我尝试的是: 视图对象必须实现 public interface HasWorkingIndicator void showWorkingIndicator(boolean show); 活动对象在开始方法中对其视图对象调用showWorkingIndicator @Override publ

我正在寻找一种在我的web应用程序中显示和隐藏工作指示器的方法。我将GWT与模型视图演示者模式一起使用,并为不同的页面和活动提供了位置,这些页面和活动是我的演示者对象

到目前为止,我尝试的是:

视图对象必须实现

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只是因为我有许多活动一遍又一遍地共享同一代码。这为我不使用