2011-02-07 90 views
1

我是一個嘗試使用MenuBar在DeckPanel中交換顯示的面板的新手。GWT:從MenuBar獲取對DockLayoutPanel的引用

我有2類和2個相關UiBinder的XML文件:

  • ApplicationUi.java
  • ApplicationUi.ui.xml
  • ApplicationMenu.java
  • ApplicationMenu.ui.xml

在ApplicationUi.java和UI XML中,根綁定到DockLayoutPanel。 ApplicationMenu旨在位於DockLayoutPanel的北部。 MenuBar選項將影響中心部分中的DeckPanel。

在ApplicationMenu中,如何獲得對DeckPanel的引用,以便我可以調用showWidget()來交換顯示的面板?

此外,由於我是一個新手,歡迎任何對此代碼的建議或評論。我在Google上盡了最大的努力,但我所尋找的許多東西似乎並沒有出現在那裏。

(這是Replace GWT DockLayoutPanel Contents的後續)。

來源: ApplicationUi.java

import org.jason.datacenter.client.forms.NewRequirementForm; 

public class ApplicationUi extends Composite { 

private static final Binder binder = GWT.create(Binder.class); 

interface Binder extends UiBinder<Widget, ApplicationUi> { 
} 

@UiField DockLayoutPanel dlp; 
@UiField VerticalSplitPanel headerPanel; 
@UiField DeckPanel deckPanel; 

public ApplicationUi() { 
    initWidget(binder.createAndBindUi(this)); 

    // add the NewRequirementForm to the deckpanel as index #0 
    deckPanel.add(new NewRequirementForm()); 
} 

public void switchDeck(int newIndex) { 
    deckPanel.showWidget(newIndex); 
} 
} 

ApplicationUi.ui.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'> 
<ui:style> 
    .panel { 
     background-color: ivory; 
    } 
</ui:style> 


<g:DockLayoutPanel ui:field="dlp"> 
    <g:north size="800"> 
     <g:VerticalSplitPanel ui:field="headerPanel"> 

     </g:VerticalSplitPanel> 
    </g:north> 
    <g:center> 
     <g:DeckPanel ui:field="deckPanel" /> 
    </g:center> 
</g:DockLayoutPanel> 

</ui:UiBinder> 

ApplicationMenu.java:

public class ApplicationMenu extends Composite { 

private static final Binder binder = GWT.create(Binder.class); 

interface Binder extends UiBinder<Widget, ApplicationMenu> { 
} 

@UiField MenuBar applicationMenu; 
@UiField MenuItem mitmNewPower; 

public ApplicationMenu() { 
    initWidget(binder.createAndBindUi(this)); 

    mitmNewPower.setCommand(new Command() { 

     @Override 
     public void execute() { 
      RootLayoutPanel rlp = RootLayoutPanel.get(); 
      DockLayoutPanel dlp = (DockLayoutPanel) rlp.getWidget(0); 

     } 
    }); 
} 

}

鴨plicationMenu.ui.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent"> 
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'> 
<ui:style> 
    .panel { 
     background-color: ivory; 
    } 
</ui:style> 

<g:MenuBar ui:field="applicationMenu"> 
    <g:MenuItem> 
     Process 
     <g:MenuBar> 
      <g:MenuItem ui:field="mitmNewPower" /> 
     </g:MenuBar> 
    </g:MenuItem> 

</g:MenuBar> 

</ui:UiBinder> 
+0

我寫了一篇關於在GWT中使用MVP的長篇回答,並且使用其中的一些想法可以幫助你實現你想要做的事情。 http://stackoverflow.com/questions/2832779/is-there-a-recommended-way-to-use-the-observer-pattern-in-mvp-using-gwt/2832919#2832919 – 2011-02-07 21:05:09

回答

2

你可以這樣做的一種方法是使用EventBus。創建一個事件類型,讓您的菜單項被點擊時觸發該類型的事件。 ApplicationUi對象可以訂閱該事件並通過更新DeckPanel的內容來響應該事件。這避免了菜單對象根本不需要知道DeckPanel