标签容器托管动态演示者窗口小部件

时间:2012-05-03 07:17:01

标签: gwt tabs gwt-platform

我想显示一个标签容器,其中每个标签都包含一个PresenterWidget。

标签是动态的 - 它们可以打开和关闭。 而且,当前选择的选项卡应该以某种方式持久存在于 URL因此可以共享或添加书签。

我看到GWTP有TabContainerPresenter,但是它用于托管 每个选项卡上的Presenter而不是PresenterWidget。你也无法添加 动态标签,与地点的关系(当然)是静态的。

我还看到了关于这个问题的几个讨论,如果是标签 托管PresenterWidget,不需要特殊的实现,所以 我们可以使用任何标签容器。例如GWT TabLayoutPanel。

但是我不明白我的PresenterWidget是如何托管的 tab)生命周期将在选项卡选择上调用,或者我应该怎么做 让生命周期工作(onReveal,onReset ......)?

我想我必须构建自己的标签容器来管理可见内容 通过插槽?

还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

Ben,TabContainerPresenter仅适用于每个标签都是一个地方的情况。至于你的问题,你只需要在每个标签中设置相同的演示者小部件。如果您在多个选项卡中注入它们,您可能希望演示者窗口小部件不是单例。这是在主演示者的插槽中设置演示者窗口小部件的示例:

@Override
protected void onBind() {
    super.onBind();
    setInSlot(TYPE_PermitContent, permitPresenter);
    setInSlot(TYPE_ErpMessageContent, orgErpMessagePresenter); 
    setInSlot(TYPE_ContractDetailContent, contractDetailPresenter);
}

然后在视图上,我的示例许可证和erp是TabLayoutPanel中的标签:

@Override
    public void setInSlot(Object slot, Widget content) {
        if (content == null) return;

        if (slot == ContractPopupWithTabPresenter.TYPE_PermitContent) {
            permit.clear();
            permit.add(content);
        } else if (slot == ContractPopupWithTabPresenter.TYPE_ErpMessageContent) {
            erp.clear();
            erp.add(content);
        } else if (slot == ContractPopupWithTabPresenter.TYPE_ContractDetailContent) {
            contractDetail.clear();
            contractDetail.add(content);
        } else {
            super.setInSlot(slot, content);
        }
    }

然后在TabLayoutPanel上添加一个beforeSelection处理程序,它看起来像这样:

tabPanel.addBeforeSelectionHandler(new BeforeSelectionHandler<Integer>() {
        @Override
        public void onBeforeSelection(BeforeSelectionEvent<Integer> event) {
            //TODO: Set your presenter widget here with whatever argument it needs to populate itself
        }
    });

希望这有帮助。

答案 1 :(得分:0)

如果任何选定的选项卡在URL中应该是持久的,那么它就是一个Place,因此应该由Presenter而不是PresenterWidget表示。

答案 2 :(得分:0)

以下是示例UiBinder实现,这当然是静态实现,如果在运行时确定了选项卡的数量,则需要创建自己的动态实现。

<g:PopupPanel styleName="{style.popupPanel}" modal="true">
        <g:HTMLPanel>
            <g:HTMLPanel styleName="titleHeader" height="20px">
                <g:Label styleName="titleHeaderCaption" ui:field="titleLabel" />
                <g:Image styleName="titleImage" ui:field="titleCloseImage" url="{images.actionCancel.getURL}"/>
            </g:HTMLPanel>
            <g:CaptionPanel captionText="{lbl.contractDetails}" styleName="captionPanel_popup">
                <g:HTMLPanel ui:field="contractDetail"/>
            </g:CaptionPanel>
            <g:TabLayoutPanel ui:field="tabPanel" barUnit="PX" barHeight="30">
                <g:tab>
                    <g:header size="7"><b>Permit</b></g:header>
                    <g:HTMLPanel ui:field="permit"/>
                </g:tab>
                <g:tab>
                    <g:header size="7"><b>ERP</b></g:header>
                    <g:HTMLPanel ui:field="erp"/>
                </g:tab>
            </g:TabLayoutPanel>
            <g:HTMLPanel styleName="{style.separator}">
                <hr/>
            </g:HTMLPanel>
            <g:HTMLPanel styleName="buttons">
                <g:Button text="{lbl.cancel}" styleName="button" ui:field="btnCancel"/>
                <g:Button text="{lbl.submit}" styleName="button" ui:field="btnSubmit"/>
            </g:HTMLPanel>
        </g:HTMLPanel>
    </g:PopupPanel>