2011-10-14 161 views
0

我在我的单元格列没有填充任何东西的问题。以下是我的代码:GWT - celltable

public class CellTableExample implements EntryPoint { 

private static class Contact 
{ 
    private String address; 
    private String name; 
    private String phone=""; 

    public Contact(String name, String address, String phone) { 
     super(); 
     this.address = address; 
     this.name = name; 
     this.phone=getPhoneNumber(name); 
    } 
} 
public String getPhoneNumber(String name) 
{ 
    String pNum=""; 
    SQLRunnerAsync service = (SQLRunnerAsync) GWT.create(SQLRunner.class); 
    AsyncCallback<String> callback = new AsyncCallback<String>() 
    { 
     @Override 
     public void onFailure(Throwable caught) 
     { 
     } 
     @Override 
     public void onSuccess(ArrayList<String[]> result) 
     { 
      pNum=reuslt; 
     } 
    }; 
    service.findPhoneNum(name,callback); 
    return pNum; 
} 


// The list of data to display. 
    private static List<Contact> CONTACTS = Arrays.asList(
    new Contact("John", "123 Fourth Road asdf asdf asdfasdf"), 
    new Contact("Mary", "222 Lancer Lane") 

); 

@Override 
public void onModuleLoad() { 
    CellTable<Contact> table = new CellTable<Contact>(); 

    SQLRunnerAsync service = (SQLRunnerAsync) GWT.create(SQLRunner.class); 
    AsyncCallback<ArrayList<String[]>> callback = new AsyncCallback<ArrayList<String[]>>() 
    { 
     @Override 
     public void onFailure(Throwable caught) 
     { 
     } 

     @Override 
     public void onSuccess(ArrayList<String[]> result) 
     { 
      compFlexTable.setPageSize(result.size()); 

      Contact[] contactArr = new Contact[result.size()]; 

      for(int i=0;i<result.size();i++) 
      {  
       String [] temp = result.get(i); 
       String name=temp[0];//name 
       String address=temp[1];//address 


       contactArr[i]=new Component1(name,address); 
      } 
      COMPONENT=Arrays.asList(compArray); 


    //address column 
    TextColumn<Contact> addressColumn = new TextColumn<Contact>(){ 
     @Override 
     public String getValue(Contact contact) { 
      return contact.address; 
     } 
    }; 

    //name column 
    TextColumn<Contact> nameColumn = new TextColumn<Contact>(){ 
     @Override 
     public String getValue(Contact contact) { 
      return contact.name; 
     } 
    }; 

      //name column 
    TextColumn<Contact> phoneColumn = new TextColumn<Contact>(){ 
     @Override 
     public String getValue(Contact contact) { 
      return contact.phone; 
     } 
    }; 
    service.getContactInfo(callback); 

    // Add the columns. 
    table.addColumn(nameColumn, "Name"); 
    table.addColumn(addressColumn, "Address"); 

    table.setRowCount(CONTACTS.size(), true); 
    table.setRowData(0, CONTACTS); 

    RootPanel.get().add(table); 
} 

}

所以,当我创建一个联系对象,另一种异步方法被调用,以获取联系人的电话号码。表格显示正常,但电话号码列为空。我该如何解决这个问题?任何意见/建议将不胜感激..非常感谢。

回答

1

您误解了程序的执行顺序。在getPhoneNumber中,您将pNum设置为“”,启动一个异步请求,然后返回pNum。 pNum在这个过程结束时仍然是“”。稍后,当您的异步请求返回时,pNum将设置为result,但此时已经太晚了 - 您的单元格已经被渲染。

基本上,你不能指望任何异步调用及时完成,以便一旦渲染被调用后准确渲染你的表格。您需要的所有数据必须在渲染之前立即可用,否则将不会显示。您可以在请求CellTable渲染自身之前,对DataProvider进行子类化以执行这些额外的检索。作为@Riley