【问题标题】:TabLayoutPanel on GWT and MVPGWT 和 MVP 上的 TabLayoutPanel
【发布时间】:2012-05-15 08:16:59
【问题描述】:

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

  • 实例化 TabLayoutPanel 的第一个视图,定义第一个 Tab 的小部件和一个空的第二个 Tab。
  • 第二个选项卡的 onSelection 我触发了一个事件,该事件将整个 TabLayoutPanel 发送到第二个视图,该视图将定义第二个选项卡的小部件。

在第二个视图中,我收到了适当的 TabLayoutPanel,但是当我检索第二个选项卡时,进行更改并将其插入旧面板中,我收到消息“此小部件的父级未实现 HasWidgets”,并且第二个选项卡消失了。

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

我用 cmets 添加了第二个视图代码。

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);
}

【问题讨论】:

    标签: gwt mvp gwt-tablayoutpanel


    【解决方案1】:

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

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

    【讨论】:

    • 在我的代码中,我在view1 的演示者中管理选择,所以我触发了一个事件,该事件将调用MDP2Presenter,它调用MDP2View,所以我不知道如何在演示者中进行更改(添加标签和文本框)1
    • 感谢您的帮助!我试过 this.tabPanel.insert(this, "MDP2", 1);我没有发现任何错误,但 MDP2 选项卡仍未显示
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多