0

我开始根据这个模型使用 MVP 架构开发与 GWT 的接口:

  • 实例化 TabLayoutPanel 的第一个视图定义了第一个 Tab 的小部件和一个空的第二个 Tab。
  • 第二个选项卡的 onSelection 我触发了一个事件,该事件将整个 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);
}
4

2 回答 2

0

当您将其构造函数中的小部件添加到父级时,问题就开始了。这导致您的代码中出现此错误。首先,您MDP2通过调用将小部件附加到 MDP2View 的新父级initWidgetMDP2View是新的父级MDP2(因为它现在已从 tabPanel 中删除)。然后在插入中您可能打算插入您的视图,而是插入它是唯一的子小部件MDP2。抛出错误是因为 insert 将隐式尝试通过该方法MDP2从其父级中删除,并且不允许. 如果我是正确的,这应该可以正常工作。MDP2ViewremoveParentMDP2Viewthis.tabPanel.insert(this, "MDP2", 1);

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

于 2012-05-15T18:55:39.863 回答
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”可能很危险:)

于 2012-06-15T23:58:49.890 回答