0

TabLayoutPanelを含むEntryPointクラスWebCrawlerOne.javaがあり、タブの1つにCellTableを含むCrawlerOne.javaを呼び出しています。私はたくさん試しましたが、エラーを見つけることができません。関連するトピックを検索しようとしましたが、プロジェクトの実行時にCellTableがTabLayoutPanelに表示されません。

  1. 私は標準モードです(DOCTYPE htmlを使用)
  2. GWT2.2.4を使用する
  3. cssでTabLayoutPanelの高さを.gwt-TabLayoutPanel{height:100%;として指定しました。}

    CrawlerOne.ui.xmlは次のようになります-g:HTMLpanelタグ内

    Hello,
    <g:Button styleName="{style.important}" ui:field="button" />
    <table cellspacing='0' cellpadding='0' style='width:100%;'>
        <tr>
            <td valign='top'>
                <c:CellTable addStyleNames="{style.cellTable}" ui:field="table"/>
            </td>
        </tr>
    </table>    
    
    <g:TextBox ui:field="box"></g:TextBox>
    <g:Button ui:field="addSite"></g:Button>
    

CrawlerOne.javaは次のようになります-

public class CrawlerOne extends Composite implements HasText {

interface CrawlerOneUiBinder extends UiBinder<Widget, CrawlerOne> {
}

@UiField
CellTable<Contact> table;

@UiField
Button addSite;

@UiField
TextBox box;

public CrawlerOne() {
    Widget w = new Widget();
    w = onInitialize();
    initWidget(w);    
}

@UiField
Button button;

@UiHandler("button")
void onClick(ClickEvent e) {
    Window.alert("Hello!");
}

public void setText(String text) {
    button.setText(text);
}

public String getText() {
    return button.getText();
}

/**
   * A simple data type that represents a contact with a unique ID.
   */
  private static class Contact {
    private static int nextId = 0;
    private final int id;

    private String site;
    private String document;
    private String pending;

    public Contact(String site, String document, String pending) {
      nextId++;
      this.id = nextId;
      this.site = site;
      this.document = document;
      this.pending = pending;
    }

    public String getDocument() {
        return document;
    }

    public int getId() {
        return id;
    }

    public String getSite() {
        return site;
    }

    public void setSite(String site) {
        this.site = site;
    }

    public String getPending() {
        return pending;
    }
  }

  /**
   * The list of data to display.
   */
private static final List<Contact> CONTACTS = new LinkedList<Contact>(Arrays.asList(
        new Contact("www.google.com", "12", "123"),
        new Contact("www.yahoo.com", "23", "124"),
        new Contact("www.rediff.com", "24", "124"),
        new Contact("www.gmail.com", "23", "124"),
        new Contact("www.facebook.com", "23", "124"),
        new Contact("www.flickr.com", "23", "124"),
        new Contact("www.youtube.com", "45", "125")));

private static final ProvidesKey<Contact> KEY_PROVIDER =
      new ProvidesKey<Contact>() {
        @Override
        public Object getKey(Contact object) {
          return object.getId();
        }
      };

  /**
   * Initialize.
   */
      public Widget onInitialize() {
        table = new CellTable<Contact>(KEY_PROVIDER);
        table.setWidth("100%", true);
        table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);

        initTableColumns();

        // Push the data into the widget.
        table.setRowData(CONTACTS);

        // Set table width.
        table.setWidth("100%");

        box = new TextBox();
        box.setText("Enter New Site");

        addSite = new Button("Add Row");
        addSite.addClickHandler(new ClickHandler() {

            @UiHandler("addSite")
            public void onClick(ClickEvent event) {
                // TODO Auto-generated method stub
                try {
                    if(box.getValue()=="") {
                        Window.alert("Error: Invalid Site Value");
                        box.setText("Enter New Site");
                    }
                    else {
                        CONTACTS.add(new Contact(box.getValue(), "23", "127"));
                        table.setRowCount(CONTACTS.size(), true);
                        table.setRowData(CONTACTS);
                        table.redraw();
                    }
                }catch (Exception e) {
                    Window.alert("Exception Error: " + e);
                }   
            }
        });

     // Create the UiBinder.
        CrawlerOneUiBinder uiBinder = GWT.create(CrawlerOneUiBinder.class);
        Widget widget = uiBinder.createAndBindUi(this);

        return widget;
  }

private void initTableColumns() {

    //code to add columns
}}//end of file

WebCrawlerOne.javaは次のようになります-

    public class WebCrawlerOne implements EntryPoint {
    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {
        TabLayoutPanel menu = new TabLayoutPanel(10, Unit.EM);

        menu.add(new CrawlerOne(), "Crawler");
        menu.add(new HTML("This is my page!"), "Page 2");
        menu.selectTab(0);
        RootLayoutPanel.get().add(menu);
    }
  }

出力は次のようになります- ここに画像の説明を入力してください

CellTableは、EntryPointクラスから直接実行された場合に表示されます。助けていただければ幸いです。ありがとう!

4

1 に答える 1

2

私はあなたが実際に必要だと思う簡単な答えに気付く前に少し書いたので、最初に簡単な答え、次に考慮すべきいくつかの事柄があります。

ファイルにの新しいインスタンスを作成CellTableしていui.xmlます。これは、ですでに構成されているCellTableインスタンスを置き換えますonInitialize。つまり、列がないため、表示されません。の呼び出しは、既に提供されているものとしてマークを付けない限り、注釈付きuibinder.createAndBindのすべてのウィジェットを通過して作成します。@UiField2つのオプション:

  • 提供されたものとしてマークします。

    @UiField(provided = true)
    CellTable<Contact> table;
    
  • uibinder.createAndBindが呼び出されるまでテーブルを構成しないでください

    //...
    Widget widget = uiBinder.createAndBindUi(this);
    table.setWidth("100%", true);
    table.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED);
    
    initTableColumns();
    
    // Push the data into the widget.
    table.setRowData(CONTACTS);
    
    // Set table width.
    table.setWidth("100%");
    

最初のオプションの方がおそらく優れているので、何かを描画する前に完全に構​​成できます。とはいえ、私もテストしていません(簡単にテストするのに十分なコードが提供されていません)。


さまざまなLayoutPanel(通常、ProvidesResizeとRequiresResizeを実装するもの)は、それぞれが持つ特定のルールに基づいて、子のサイズを決定します。

これらは直接の子のサイズを設定することしかできません-サイズ変更を必要としない子(HTMLPanelなど)が与えられた場合、そこではレイアウト作業を行わず、代わりに、コンテナーが適切と思われる方法で子のサイズを設定することを期待します。

したがって、ui.xmlファイルに描画したHtmlPanelとhtmlは、TabLayoutPanelがレイアウト情報をCellTableに正しく渡すことを可能にする妨げになっている可能性があります。レイアウトを使用したくない場合は、これは良いことです。CellTableのサイズを別の方法で設定する必要があります。

最後に考えたのは、FireBugなどを使用して、DOMが期待どおりに設定されていることを確認することです。そこにセルテーブルが存在することがわかりますが、コンテンツはありません。

于 2012-02-17T00:28:16.920 に答える