在GWTP中,如何处理TabLayoutPanel事件?

时间:2012-06-15 15:09:44

标签: gwt gwtp

我已经关注过Dani的GWTP课程,但是不使用TabLayoutPanel和演示者。

我有一个带有3个标签的TabLayoutPanel(每个标签上都有一个VerticalPanel)。我使用了@ProxyCodeSplit,因此每个选项卡的代码都是独立加载的。

如果在Eclipse中,在GWT的Designer中我为OnBeforeSelection添加了一个处理程序,那么代码会自动添加到我的View中。然后,View可以加载适当的演示者。

这不是代码的合适位置 - 但是它呢?

如何在TabLayoutPanel中处理不同的标签并进行代码拆分?

1 个答案:

答案 0 :(得分:0)

我想我已经弄明白了。

在使用TabLayoutPanel的演示者中(让我们称之为MainPresenter):

@ContentSlot public static final Type<RevealContentHandler<?>> SLOT_first = new Type<RevealContentHandler<?>>();
@ContentSlot public static final Type<RevealContentHandler<?>> SLOT_second = new Type<RevealContentHandler<?>>();

public interface MyView extends View {
    public void setMainPresenter(MainPresenter presenter);
    public TabLayoutPanel getTeamsPanel();
}

@Inject PlaceManager placeMananger;
@Inject FirstPresenter firstPresenter;
@Inject SecondPresenter secondPresenter;

@ProxyCodeSplit
public interface MyProxy extends Proxy<MainPresenter> {
}

@Inject
public MainPresenter(final EventBus eventBus, final MyView view,
        final MyProxy proxy) {
    super(eventBus, view, proxy);
    view.setMainPresenter(this);
}

@Override
protected void revealInParent() {
    RevealRootContentEvent.fire(this, this);
}

public void setTabContents(Integer tab) {
    if (tab == 0) {
        placeMananger.revealPlace(new PlaceRequest("first"));
    } else if (tab == 1) {
        placeMananger.revealPlace(new PlaceRequest("second"));
}

然后在MainView中实现方法setMainPresenter()以在本地存储引用。实现通常的setInSlot(),然后添加此选项卡处理程序:

@UiHandler("mainTabs")
void onMainTabsBeforeSelection(BeforeSelectionEvent<Integer> event) {
    mainPresenter.setTabContents(event.getItem());
}

每次用户更改标签时,处理程序都会调用MainPresenter。然后setTabContents()将为相应的“tab”Presenter调用revealInParent()。