2015-11-18 3 views
0

У меня есть небольшой проект веб-приложения с использованием GWT, где кнопка обрабатывает событие: заполнение панели виджетами. В настоящее время нажатие кнопки второй раз дублирует панель, я хочу, чтобы она очищала панель, и повторно добавляет виджеты.Использование кнопки для обновления панели в GWT

До сих пор у меня есть:

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 
     } 
    }); 

Я понимаю, что все, что вы перейти к функции запуска должен быть в качестве окончательной декларации, так как я получаю вокруг этого?

+0

Я не рекомендую использовать таймер для ожидания обратного вызова. Почему бы не упаковать блок-очистку и код добавления виджета в функцию onSuccess обратного вызова? Тогда вы можете быть уверены, что он всегда вызывается после того, как данные благополучно прибыли. – subrunner

+0

Я знаю, что это не лучшая практика, но поскольку функция onSuccess не может вернуть объект, мне пришлось бы передать каждый объект, который мне нужен, с помощью asyncallback, что делает его очень грязным. Я не знаю, как обойти это –

+0

См. Ответ в http://stackoverflow.com/a/33808565/2746149 – subrunner

ответ

1

Вы можете использовать clear метод:

panel.clear(); 
1

Изменение final HorizontalPanel panel = new HorizontalPanel(); на атрибут уровня класса. Затем его можно легко передать во внутренние анонимные классы. И вы можете использовать четкий метод внутри метода таймера, как предложено @ philfr49 например

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 
    } 
}); 
+0

, который работает, спасибо! –

1

Продолжение от комментариев на вопрос - с помощью таймера ждать результата обратного вызова не рекомендуется.

Я предполагаю, что вы работаете со строгим разделением Model-View-Controller и что напечатанный вами код является частью View с обратным вызовом, происходящим в отдельном классе контроллера.

Теперь, если это не так много вещей, которые добавляются к панели, я использую следующую конструкцию:

/* 
* 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, сохранить логику в контроллере и просто вызвать соответствующие функции View, чтобы отобразить все необходимое.

+0

Теперь я понимаю, что использование структуры mvc лучше всего, если я начну новый проект, но для этого случая мне пришлось бы реорганизовать много кода только для нескольких asyncCallbacks. Мне удалось сделать это правильно, поместив весь код, зависящий от asyncCallBack внутри экземпляра внутреннего класса Runnable и передав этот экземпляр функции async, чтобы он выполнялся с успехом. Спасибо за урок, хотя, и я ценю ваше объяснение. –

Смежные вопросы