GWTP&x2B;Gxt:在页面的两个单独插槽中使用相同的presenter小部件时出现异常

GWTP&x2B;Gxt:在页面的两个单独插槽中使用相同的presenter小部件时出现异常,gwt,gxt,gwt-platform,Gwt,Gxt,Gwt Platform,我有一个带有边框布局的页面,并为边框布局的每个区域定义了插槽(例如,东、西、北、中……) 我希望通过在页面上面的两个插槽中显示presenter小部件来重用它。 我成功地在其中一个插槽上显示了presenter小部件,但每当我尝试在两个单独的插槽中添加presenter小部件时,就会出现以下错误: 捕获异常:对可见演示者调用notifyReveal() 谁能告诉我怎么做吗 下面是我的代码 HomeView.java @UiField ContentPanel centerPanel; @UiF

我有一个带有边框布局的页面,并为边框布局的每个区域定义了插槽(例如,东、西、北、中……)

我希望通过在页面上面的两个插槽中显示presenter小部件来重用它。 我成功地在其中一个插槽上显示了presenter小部件,但每当我尝试在两个单独的插槽中添加presenter小部件时,就会出现以下错误:

捕获异常:对可见演示者调用notifyReveal()

谁能告诉我怎么做吗

下面是我的代码

HomeView.java

@UiField
ContentPanel centerPanel;

@UiField
ContentPanel westPanel;

@Override
public void setInSlot(Object slot, Widget content) {

    if (slot == HomePresenter.SLOT_EAST) {
        if (content != null) {
            eastPanel.add(content);
        }
    } else if (slot == HomePresenter.SLOT_WEST) {
        if (content != null) {
            westPanel.add(content);
        }
    } else if (slot == HomePresenter.SLOT_CENTER) {
        if (content != null) {
            centerPanel.add(content);
        }
    } else {
        super.setInSlot(slot, content);
    }
}

@Override
public void addToSlot(Object slot, Widget content) {
    if (slot == HomePresenter.SLOT_EAST) {
        if (content != null) {
            eastPanel.add(content);
        }
    } else if (slot == HomePresenter.SLOT_WEST) {
        if (content != null) {
            westPanel.add(content);
        }
    } else if (slot == HomePresenter.SLOT_CENTER) {
        if (content != null) {
            centerPanel.add(content);
        }
    } else {
        super.addToSlot(slot, content);
    }
}
HomePresenter.java:

public static final Object SLOT_WEST = new Object();

public static final Object SLOT_CENTER = new Object();

@Override
protected void revealInParent() {
    RevealRootContentEvent.fire(this, this); //Getting error over here
}

@Override
protected void onReset() {
    super.onReset();

    setInSlot(SLOT_WEST, null);
    setInSlot(SLOT_CENTER, null);

    indirectProvider.get(new AsyncCallback<LeftPanelPresenter>() {

        @Override
        public void onSuccess(LeftPanelPresenter result) {
            addToSlot(SLOT_WEST, result);
            addToSlot(SLOT_CENTER, result);
        }

        @Override
        public void onFailure(Throwable caught) {
            // TODO Auto-generated method stub
            System.out.println("Not added to the slot");
        }
    });
}
publicstaticfinalobjectslot_WEST=newobject();
公共静态最终对象槽_中心=新对象();
@凌驾
受保护的无效父对象(){
RevealRootContentEvent.fire(this,this);//在此处获取错误
}
@凌驾
受保护的void onReset(){
super.onReset();
setInSlot(槽西,空);
setInSlot(插槽_中心,空);
获取(新的AsyncCallback(){
@凌驾
成功时公共无效(LeftPanelPresenter结果){
addToSlot(西槽,结果);
addToSlot(插槽_中心,结果);
}
@凌驾
失败时的公共无效(可丢弃){
//TODO自动生成的方法存根
System.out.println(“未添加到插槽”);
}
});
}

提供者的要点是为每个要放置它的位置创建一个新实例

我认为使用相同的
result
对象调用
addToSlot()
两次会导致错误,因为该实例已经被显示

可以使用循环为每个插槽创建新实例:

// create an array of the slots
List<Object> slots = new ArrayList<Object>();
slots.add(SLOT_WEST);
slots.add(SLOT_CENTER);

// call provider.get() on each slot in turn
for(Object slot : slots)
{
    indirectProvider.get(new AsyncCallback<LeftPanelPresenter>()
    {
        @Override
        public void onSuccess(LeftPanelPresenter result)
        {
            addToSlot(slot, result);
        }

        @Override
        public void onFailure(Throwable caught)
        {
            // TODO Auto-generated method stub
            System.out.println("Not added to the slot");
        }
    });
}
//创建插槽数组
列表插槽=新的ArrayList();
插槽。添加(插槽西侧);
插槽。添加(插槽\u中心);
//依次在每个插槽上调用provider.get()
用于(对象插槽:插槽)
{
获取(新的AsyncCallback()
{
@凌驾
成功时公共无效(LeftPanelPresenter结果)
{
addToSlot(插槽、结果);
}
@凌驾
失败时的公共无效(可丢弃)
{
//TODO自动生成的方法存根
System.out.println(“未添加到插槽”);
}
});
}