关于GWT和MVP的表格输出面板

关于GWT和MVP的表格输出面板,gwt,mvp,gwt-tablayoutpanel,Gwt,Mvp,Gwt Tablayoutpanel,我开始根据以下模型使用MVP体系结构开发与GWT的接口: 第一个视图实例化一个TabLayoutPanel,定义第一个选项卡的小部件和一个空的第二个选项卡 在选择第二个选项卡时,我触发一个事件,将整个TabLayoutPanel发送到第二个视图,该视图将定义第二个选项卡的小部件 在第二个视图中,我收到了相应的TabLayoutPanel,但当我检索到第二个选项卡,进行更改并将其插入到旧面板中时,我收到了消息“此小部件的父级未实现HasWidgets”,第二个选项卡消失 感谢您帮助我了解这里真

我开始根据以下模型使用MVP体系结构开发与GWT的接口:

  • 第一个视图实例化一个TabLayoutPanel,定义第一个选项卡的小部件和一个空的第二个选项卡
  • 在选择第二个选项卡时,我触发一个事件,将整个TabLayoutPanel发送到第二个视图,该视图将定义第二个选项卡的小部件
在第二个视图中,我收到了相应的TabLayoutPanel,但当我检索到第二个选项卡,进行更改并将其插入到旧面板中时,我收到了消息“此小部件的父级未实现HasWidgets”,第二个选项卡消失

感谢您帮助我了解这里真正的问题是什么,或者如何解决

我添加了带有注释的第二个视图代码

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);
}
公共类MDP2View扩展了复合实现MDP2Presenter.Display{
专用最终表格输出面板选项卡面板;
私人最终垂直面板MDP2;
私人最终标签;
公共MDP2View(HasSelectionHandlers选项卡面板){
//获取在第一个视图上创建的TabLayoutPanel
this.tabPanel=(TabLayoutPanel)tabPanel;
//获取第二个选项卡(这将从TabLayoutPanel中删除该选项卡)
MDP2=(VerticalPanel)this.tabPanel.getWidget(1);
initWidget(MDP2);
//将标签添加到选项卡
标签=新标签();
label.setText(“onSelectionHandler工作!!!”;
MDP2.add(标签);
//在选项卡面板中插入选项卡
这个.tabPanel.insert(MDP2,“MDP2”,1);
}

当您将其构造函数中的小部件添加到父级时,问题开始出现。这导致了代码中的此错误。首先,您将
MDP2
小部件附加到新的父级。通过调用
initWidget
MDP2View
将MDP2视图附加到新的父级(因为它现在已从选项卡面板中删除)。然后在insert中,您可能打算插入视图,但将其作为小部件
MDP2
的唯一子项插入。引发此错误的原因是insert将通过
removeParent
方法隐式尝试从其父项
MDP2View
中删除
MDP2View
,而
MDP2View。如果我是正确的,这应该可以使它工作
这个.tabPanel.insert(这个“MDP2”,1);


但是最好从这个构造函数中删除与tabPanel的交互,并将其移动到例如selectionHandler的实现中。这将使您的视图更清晰。这段代码只是在等待将来的错误:强制转换到TabLayoutPanel,强制转换到VerticalPanel;如果您更改该小部件,会导致runtim吗e错误。获取并插入硬编码位置1;如果在1之前添加一个制表符怎么办;您的编码将不正确。

我认为您必须创建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”可能是危险的:)

在我的代码中,我管理
view1
的presenter中的选择,因此我触发一个事件,调用
MDP2Presenter
,调用
MDP2View
,因此我不知道如何进行更改(添加标签和文本框)在演示者1中,感谢您的帮助!我尝试了此.tabPanel.insert(此为“MDP2”,1);我没有发现任何错误,但MDP2选项卡仍然未显示