2016-08-04 2 views
0

На стороне клиента я размещаю вызов на стороне сервера для списка имен из базы данных. Когда этот список возвращается на клиентскую сторону, я показываю каждое имя в TabPanel. Когда отображается каждое имя, я помещаю вызов на сервер стороне списка адресов для этого имени из базы данных на стороне сервера (это я могу обновить и добавить). Когда возвращается список адресов, я добавляю их в FlexTable внутри DisclosurePanel.Ошибка GWT Java с AsyncCallback в рамках метода

Итак, у меня есть TabPanel, содержащий имя и DisclosurePanel, содержащие связанные адреса.

Проблема в том, что я не могу получить вызов в базе данных в методе DisclosurePanel, чтобы получить правильные адреса.

Код:

private DisclosurePanel addressDisclosurePanel(String nameId) { 
    DisclosurePanel addressDisclosurePanel = new DisclosurePanel("Address"); 

    //Get the Addresses 
    AsyncCallback<List<Address>> callback = new GetAddressHandler<List<Address>>(); 
    rpc.getAddressList(nameId, callback); 


    class GetAddressHandler<T> implements AsyncCallback<List<Address>> { 
     //Get the list of Addresses. 
     PersonalDetailsView view; 

     public GetAddressHandler(PersonalDetailsView view) { 
      this.view = view; 
     } 

     public void onFailure(Throwable ex) { 
      System.out.println("RPC call failed - GetAddressHandler - Notify Administrator."); 
      Window.alert("Connection failed - please retry."); 
     } 
     public void onSuccess(List<Address> result) { 
      view.renderAddresses(result); 
     } 
    } 

    public void renderAddresses(List<Address> addressList) { 
     //Load each TabPanel with Addresses 

     final FlexTable flexTableAddress = new FlexTable(); 

     if (addressList == null || addressList.isEmpty()) { 
      //Add a place to add an address 

      //Address Type 
      final Label lblAddressType = new Label("Address Type:"); 
      lblAddressType.setStyleName("gwt-Label-Login"); 
      flexTableAddress.setWidget(0, 0, lblAddressType); 

      final TextBox textBoxAddressType = new TextBox(); 
      textBoxAddressType.setStyleName("gwt-TextBox"); 
      textBoxAddressType.setWidth("300px"); 
      flexTableAddress.setWidget(0, 1, textBoxAddressType); 

      addressDisclosurePanel.add(flexTableAddress); 

     }else{ 
      int row = 0; 
      // 
      //Create a place to display each Address and allow update 
      // 
      for (final Address eachAddress : addressList) { 
       //Store key 
       final String addId = eachAddress.getAddId(); 

       //Address Type 
       final Label lblAddressType = new Label("Address Type:"); 
       lblAddressType.setStyleName("gwt-Label-Login"); 
       flexTableAddress.setWidget(row, 0, lblAddressType); 

       final TextBox textBoxAddressType = new TextBox(); 
       textBoxAddressType.setText(eachAddress.getAddType()); 
       textBoxAddressType.setStyleName("gwt-TextBox"); 
       textBoxAddressType.setWidth("300px"); 
       flexTableAddress.setWidget(row, 1, textBoxAddressType); 

       row++; 
      } 
      addressDisclosurePanel.add(flexTableAddress); 
     } 
    } 
    return addressDisclosurePanel; 
} 

Ошибка на линии:

сообщение
view.renderAddresses(result); 

Ошибка "Метод renderAddresses (Список) не определен для типа PersonalDetailsView".

на линии:

public void renderAddresses(List<Address> addressList) { 

Сообщение об ошибке «Множественные маркеры на этой линии - ошибка синтаксиса на маркер„)“, Вероятное - Синтаксическая ошибка на маркер„(“; ожидается - пустота недопустимый тип для переменной renderAddresses»

Я сделал это изменение:

private DisclosurePanel addressDisclosurePanel(String nameId) { 
    final DisclosurePanel addressDisclosurePanel = new DisclosurePanel("Address"); 

    //Get the Addresses 
    AsyncCallback<List<Address>> callback = new GetAddressHandler<List<Address>>(PersonalDetailsView.this); 
    rpc.getAddressList(nameId, callback); 

    //addressDisclosurePanel.add(addressHorizontalPanel); 

    return addressDisclosurePanel; 
} 

class GetAddressHandler<T> implements AsyncCallback<List<Address>> { 
    //Get the list of Addresses. 
    PersonalDetailsView view; 

    final HorizontalPanel addressHorizontalPanel = new HorizontalPanel(); 

    public GetAddressHandler(PersonalDetailsView view) { 
     this.view = view; 
    } 

    public void onFailure(Throwable ex) { 
     System.out.println("RPC call failed - GetAddressHandler - Notify Administrator."); 
     Window.alert("Connection failed - please retry."); 
    } 
    public void onSuccess(List<Address> result) { 
     Window.alert("Render address."); 
     addressHorizontalPanel.add(view.renderAddresses(result)); 
    } 
} 

private FlexTable renderAddresses(List<Address> addressList) { 
    //Load each TabPanel with Addresses 
    Window.alert("get address.");; 

    final FlexTable flexTableAddress = new FlexTable(); 

    if (addressList == null || addressList.isEmpty()) { 
     //Add a place to add an address 

     //Address Type 
     final Label lblAddressType = new Label("Address Type:"); 
     lblAddressType.setStyleName("gwt-Label-Login"); 
     flexTableAddress.setWidget(0, 0, lblAddressType); 

     final TextBox textBoxAddressType = new TextBox(); 
     textBoxAddressType.setStyleName("gwt-TextBox"); 
     textBoxAddressType.setWidth("300px"); 
     flexTableAddress.setWidget(0, 1, textBoxAddressType); 

    }else{ 
     int row = 0; 
     // 
     //Create a place to display each Address and allow update 
     // 
     for (final Address eachAddress : addressList) { 
      //Store key 
      final String addId = eachAddress.getAddId(); 
      Window.alert("addId = " + addId); 

      //Address Type 
      final Label lblAddressType = new Label("Address Type:"); 
      lblAddressType.setStyleName("gwt-Label-Login"); 
      flexTableAddress.setWidget(row, 0, lblAddressType); 

      final TextBox textBoxAddressType = new TextBox(); 
      textBoxAddressType.setText(eachAddress.getAddType()); 
      textBoxAddressType.setStyleName("gwt-TextBox"); 
      textBoxAddressType.setWidth("300px"); 
      flexTableAddress.setWidget(row, 1, textBoxAddressType); 

      row++; 
     } 
    } 
    return flexTableAddress; 
} 

Так как я возвращаю адрес от:

class GetAddressHandler<T> implements AsyncCallback<List<Address>> { 

к DisclosurePanel?

+0

Вы не можете объявить класс внутри метода – Jens

ответ

1

Вы не можете объявить класс внутри метода. Так Меняют:

//Get the Addresses 
    AsyncCallback<List<Address>> callback = new GetAddressHandler<List<Address>>(); 
    rpc.getAddressList(nameId, callback); 


    class GetAddressHandler<T> implements AsyncCallback<List<Address>> { 
     //Get the list of Addresses. 
     PersonalDetailsView view; 

     public GetAddressHandler(PersonalDetailsView view) { 
      this.view = view; 
     } 

     public void onFailure(Throwable ex) { 
      System.out.println("RPC call failed - GetAddressHandler - Notify Administrator."); 
      Window.alert("Connection failed - please retry."); 
     } 
     public void onSuccess(List<Address> result) { 
      view.renderAddresses(result); 
     } 
    } 

к:

//Get the Addresses 
AsyncCallback<List<Address>> callback = new AsyncCallback<List<Address>> { 
    //Get the list of Addresses. 
    PersonalDetailsView view; 

    public GetAddressHandler(PersonalDetailsView view) { 
     this.view = view; 
    } 

    public void onFailure(Throwable ex) { 
     System.out.println("RPC call failed - GetAddressHandler - Notify Administrator."); 
     Window.alert("Connection failed - please retry."); 
    } 
    public void onSuccess(List<Address> result) { 
     view.renderAddresses(result); 
    } 
} 
    rpc.getAddressList(nameId, callback); 

Надежды нет Синтаксической ошибки в моем редактировании;)

+0

Я применил это изменение и допустил несколько ошибок. rpc.getAddressList (nameId, callback); - обратный вызов не может быть разрешен переменной. Должен AsyncCallback <Список

> callback = new AsyncCallback <Список
> включает (PersonalDetailsView.this) в конце. Вот как все мои другие звонки. Это было удалено ранее, когда я принял системное предложение. Может быть, его нужно добавить обратно? Когда я добавил его назад, было несколько меньше ошибок; однако все еще ошибки. – Glyn

+0

И какие ошибки? – Jens

+0

На самом деле да, вы можете объявить класс внутри метода. Но вы не можете объявить метод/функцию внутри метода. –