GWT - celltable

时间:2011-10-14 17:52:01

标签: gwt

我的单元格表中的列没有填充任何内容时遇到问题。以下是我的代码:

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

}

因此,当我创建联系人对象时,会调用另一个异步方法来获取联系人的电话号码。该表显示正常,但电话号码列为空。我该如何解决这个问题?任何想法/建议将不胜感激..非常感谢提前。

2 个答案:

答案 0 :(得分:1)

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

基本上,一旦调用了渲染,就不能指望任何异步调用能够及时完成渲染表。您需要的所有数据必须在渲染之前立即可用,否则它将不会显示。在要求CellTable呈现自己之前,您可以将DataProvider子类化以执行这些额外检索。

答案 1 :(得分:0)

使用异步数据提供程序@Riley说

更多参考使用以下链接..

http://www.mytechtip.com/2010/11/gwt-celltable-example-using_8168.html