На стороне клиента я размещаю вызов на стороне сервера для списка имен из базы данных. Когда этот список возвращается на клиентскую сторону, я показываю каждое имя в 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?
Вы не можете объявить класс внутри метода – Jens