我正在尝试创建一个也使用Google Gears的Google Web Toolkit(GWT)应用程序,但每次我尝试删除该面板时,都会遇到异常,并且该小组会在那里停留。
这是我得到的异常的摘录(我只包含了调用堆栈的相关位,其余的只是下面的包含函数):
java.lang.AssertionError: A widget that has an existing parent widget may not be added to the detach list
at com.google.gwt.user.client.ui.RootPanel.detachOnWindowClose(RootPanel.java:122)
at com.google.gwt.user.client.ui.RootPanel.get(RootPanel.java:197)
我不确定问题是什么,但我真的不喜欢在批准使用Gears之后将按钮留在那里。
我做错了什么?或者以不同的方式提出任何建议我可以做到这一点吗?
if(!gearsFactory.hasPermission()) {
HorizontalPanel rightPanel = new HorizontalPanel();
rightPanel.getElement().setId("gearsPrompt");
rightPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
rightPanel.setSpacing(0);
rightPanel.setHeight("28px");
InlineLabel enableGearsText = new InlineLabel("Enable Gears for off-line access");
enableGearsText.getElement().setId("gearsText");
enableGearsText.addStyleName("titleElement");
rightPanel.add(enableGearsText);
final Button gearsButton = new Button("Use Gears");
gearsButton.getElement().setId("gearsButton");
gearsButton.addStyleName("titleElement");
gearsButton.setHeight("24px");
gearsButton.addClickHandler( new ClickHandler() {
public void onClick(ClickEvent event) {
Factory gearsFactory = Factory.getInstance();
if(gearsFactory != null) {
if(gearsFactory.getPermission()) {
RootPanel gearsPrompt = RootPanel.get("gearsPrompt");
gearsPrompt.removeFromParent();
}
}
}
});
rightPanel.add(gearsButton);
RootPanel titleBarRight = RootPanel.get("titleBarRight");
titleBarRight.add(rightPanel);
}
答案 0 :(得分:1)
我发现的一个解决方案是遍历“titleBarRight”面板下的所有小部件并删除它包含的所有小部件:
if(gearsFactory.getPermission()) {
RootPanel titleBarRight = RootPanel.get("titleBarRight");
java.util.Iterator<Widget> itr = titleBarRight.iterator();
while(itr.hasNext()) {
itr.next();
itr.remove();
}
}
但不知何故,这似乎仍然是hacky,并不是“正确的方法。”
答案 1 :(得分:1)
我知道这是旧的,但是怎么样......
gearsButton.addClickHandler( new ClickHandler() {
public void onClick(ClickEvent event) {
Factory gearsFactory = Factory.getInstance();
if(gearsFactory != null) {
if(gearsFactory.getPermission()) {
Button btn=(Button) event.getSource();
btn.removeFromParent();
}
}
}
});
答案 2 :(得分:0)
是否有任何理由使用RootPanel.get("gearsPrompt").removeFromParent();
代替您自己的rightPanel.removeFromParent();
?参考已经存在。
答案 3 :(得分:0)
你可以这样做:
theParentWidget.remove(index);
并且第一个孩子对应0;