我有一个包含TabLayoutPanel的EntryPoint类WebCrawlerOne.java,在我调用的CrawlerOne.java其中一个选项卡中包含了CellTable。我已经尝试了很多,但无法找到任何错误。我试图搜索相关主题但仍然在运行项目时TabLayoutPanel中看不到CellTable。
已将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>
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);
}
}
输出看起来像 -
如果直接从EntryPoint类运行,则会显示CellTable。任何帮助赞赏。谢谢!
答案 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按照您的预期设置。在那里你会看到小单元存在,但没有任何内容。