在 GWT 中使用按钮刷新面板

Using a button to refresh a panel in GWT

我有一个使用 GWT 的小型 Web 应用程序项目,其中一个按钮处理一个事件:使用小部件填充面板。目前,第二次单击该按钮将复制面板,我想要它以便清除面板,然后重新添加小部件。

到目前为止我有:

final Button b = new Button("get schools near me");
    final HorizontalPanel panel = new HorizontalPanel();
    panel.getElement().setId("distanceTable");
    RootPanel.get("core").add(b);
    RootPanel.get("core").add(panel);
    b.addClickHandler(new ClickHandler(){
        @Override
        public void onClick(ClickEvent event) {
            Timer t = new Timer(){
                @Override
                public void run() {
                    //how do you clear the panel here first? before you
                    // do a bunch of things along the lines of:
                    panel.add(widget);
                    panel.add(widget2);
                }
            };
            t.schedule(1400); // wait 1.4 seconds for callback
        }
    });

我知道你传递给 运行 函数的任何东西都必须作为最终声明,那么我该如何解决这个问题?

您可以使用clear方法:

panel.clear();

final HorizontalPanel panel = new HorizontalPanel(); 更改为 class 级别属性。然后它可以很容易地传递给内部匿名classes。您可以按照 @philfr49 的建议在 Timer 方法中使用 clear 方法 例如

private HorizontalPanel panel = new HorizontalPanel();
.....
// Elsewhere
.....
final Button b = new Button("get schools near me");
panel.getElement().setId("distanceTable");
RootPanel.get("core").add(b);
RootPanel.get("core").add(panel);
b.addClickHandler(new ClickHandler(){
    @Override
    public void onClick(ClickEvent event) {
        Timer t = new Timer(){
            @Override
            public void run() {
                panel.clear();
                panel.add(widget);
                panel.add(widget2);
            }
        };
        t.schedule(1400); // wait 1.4 seconds for callback
    }
});

接问题的评论——不推荐使用计时器等待回调结果。

我假设您正在使用严格的模型-视图-控制器分离,并且您打印的代码是视图部分,回调发生在单独的控制器中 class。

现在,如果没有向面板添加很多东西,我会使用以下结构:

/*
 * contains all the display parts of the appliation
 */
class View{

  private HorizontalPanel panel = new HorizontalPanel(); // panel as a field

  /*
   * Getter for panel
   */
  public HorizontalPanel getPanel(){
    return this.panel;
  }

  /**
    * Method to create the display part for 'Schools Near Me'
    *
    * @param schoolsNearMeHandler Clickhandler that decides what happens
    *                             when the 'near me' button is clicked
    *                             Contains code to request from server
    *                             and display server result
    */
  public void createSchoolsNearMeSection(ClickHandler schoolsNearMeHandler){
    final Button b = new Button("get schools near me");
    panel.getElement().setId("distanceTable");
    RootPanel.get("core").add(b);
    RootPanel.get("core").add(panel);
    b.addClickHandler(schoolsNearMeHandler);
  }

}

/*
 * Creates and operates the View and makes sure the correct things get displayed
 */
class Controller{

  private View view;

  public Controller(){
     // since the Controller drives the Model-View-Controller part,
     // the view is being created here
     view = new View();

     // TODO more code to set up the view to perfection

     // Create the 'schools near me' section
     view.createSchoolsNearMeSection(new ClickHandler(){
      @Override
      public void onClick(ClickEvent event) {
          loadSchoolsNearMe(); // send request to server
      }
    }
  }

  /**
    * Loads schools near me from the server
    */
  private void loadSchoolsNearMe(){

    // generic callback -- use whatever callback interface is required for your way of requesting data from server
    Callback callback = new Callback(){

      public void onSuccess(ServerResult result){

         // retrieve the panel where you want to display your data
         HorizontalPanel panel = view.getPanel();
         panel.clear();

         // TODO execute whatever code necessary to create
         // widget and widget2 from the ServerResult

         // display the newly generated widgets
         panel.add(widget);
         panel.add(widget2);
      }

      public void onError(...){
         // handle errors
      }

    }

    // Create request
    Request request = new Request(...);

    // Execute request
    RequestBuilder.execute(request, callback);
  }


}

当然,如果服务器结果有很多复杂的代码和视图构建,你可以再次将显示部分放入View对象,将逻辑保留在Controller中,并且只需调用相应的 View 函数即可显示任何需要的内容。