我根据这个模型开始使用MVP架构开发GWT接口:
在第二个视图中,我收到了相应的TabLayoutPanel,但是当我检索第二个Tab时,进行更改并将其插入旧面板中,我收到消息“此小部件的父级未实现HasWidgets”,第二个Tab消失。
感谢您帮我看看这里的真正问题是什么,或者如何做到这一点。
我添加了带注释的第二个视图代码。
public class MDP2View extends Composite implements MDP2Presenter.Display {
private final TabLayoutPanel tabPanel;
private final VerticalPanel MDP2;
private final Label label;
public MDP2View(HasSelectionHandlers<Integer> tabPanel) {
// Getting the TabLayoutPanel created on the first View
this.tabPanel = (TabLayoutPanel) tabPanel;
// Getting the second Tab (this will remove the Tab from the TabLayoutPanel)
MDP2 = (VerticalPanel) this.tabPanel.getWidget(1);
initWidget(MDP2);
// Adding a label to the Tab
label = new Label();
label.setText("onSelectionHandler Works!!!");
MDP2.add(label);
// Inserting the Tab in the tabPanel
this.tabPanel.insert(MDP2, "MDP2", 1);
}
答案 0 :(得分:0)
当您将其构造函数中的窗口小部件添加到父窗口时,问题就开始了。这导致您的代码中出现此错误。首先,通过调用MDP2
将initWidget
窗口小部件附加到MDP2View的新父窗口。 MDP2View
是MDP2
的新父级(因为它现在已从tabPanel中删除)。然后在插入中你可能打算插入你的视图,而是将它唯一的子元素插入小部件MDP2
。抛出错误是因为insert将隐式尝试通过方法MDP2
从其父MDP2View
中删除removeParent
,并且不允许MDP2View
的子窗口小部件。如果我是正确的,这应该使它工作this.tabPanel.insert(this, "MDP2", 1);
。
但是从这个构造函数中移除与tabPanel的交互并将其移动到例如selectionHandler的实现更好。这将使您的视图更清洁。这段代码只是等待未来的错误:强制转换为TabLayoutPanel,强制转换为VerticalPanel;如果更改该窗口小部件会导致运行时错误。获取并插入硬编码位置1;如果你在1之前添加一个标签怎么办你的代码表现不正确。
答案 1 :(得分:0)
我认为您必须创建MDP2对象而不在现有窗口小部件上获取引用(此处为this.tabPanel.getWidget(1)
)。然后,将全新的MDP2插入tabpanel#1
。
类似的东西:
MDP2 = initWidget(new VerticalPanel());
// Adding a label to the Tab
label = new Label();
label.setText("onSelectionHandler Works!!!");
MDP2.add(label);
// Inserting the Tab in the tabPanel
this.tabPanel.insert(MDP2, "MDP2", 1);
我认为在已经存在的东西上调用方法“init”可能很危险:)