在TabLayoutPanel中看不到CellTable

时间:2012-02-16 17:13:44

标签: java gwt uibinder gwt-2.2-celltable gwt-tablayoutpanel

我有一个包含TabLayoutPanel的EntryPoint类WebCrawlerOne.java,在我调用的CrawlerOne.java其中一个选项卡中包含了CellTable。我已经尝试了很多,但无法找到任何错误。我试图搜索相关主题但仍然在运行项目时TabLayoutPanel中看不到CellTable。

  1. 我处于标准模式(使用DOCTYPE html)
  2. 使用GWT 2.2.4
  3. 已将css中TabLayoutPanel的高度指定为.gwt-TabLayoutPanel { 身高: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>
    

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

    输出看起来像 - enter image description here

    如果直接从EntryPoint类运行,则会显示CellTable。任何帮助赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

在我意识到你认为你真正需要的简单答案之前,我写了一点,所以首先,简单的答案,然后再考虑一些事情。

您正在CellTable文件中创建ui.xml的新实例。这正在替换CellTable中已配置的onInitialize实例,这意味着它没有列,因此不可见。对uibinder.createAndBind的调用将通过@UiField注释创建所有小部件,除非您将它们标记为已提供。两个选项:

  • 按提供标记:

    @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(通常是实现ProvideResize和RequiresResize的东西)根据每个人的具体规则调整其子项的大小。

这些只能调整他们的直接孩子的大小 - 如果给一个不需要调整大小的孩子(如HTMLPanel),他们不会在那里做任何布局工作,而是期望容器调整它的孩子的大小,但它认为合适。 / p>

因此,您在ui.xml文件中绘制的HtmlPanel和html可能会妨碍TabLayoutPanel正确地将布局信息传递给CellTable。如果您不想使用布局内容,那么这是一件好事 - 您需要以其他方式调整CellTable的大小。

最后一个想法:使用FireBug等确保dom按照您的预期设置。在那里你会看到小单元存在,但没有任何内容。