2011-11-23 8 views
9

私はGWT MVPとUiBinderを使ってDockLayoutPanelでアプリケーションを作成しています。私は北と南のドックを静的にし、ボタンとリンクを含んでいます。私は中心部と東ドックの2つの異なるエリアでダイナミックな見方をしたい。これらの動的領域は互いに独立している必要があるため、動的表示領域ごとに異なるActivityMapperとActivityManagerを設定しています。センター、イーストトップ、およびイーストボトムを含む。方法:UiBinder + GWT MVP +複数の独立した表示エリア

アプリケーションがロードされたときに、これら3つの異なる表示領域を個別に初期化するにはどうすればよいですか?他のエリアに影響を与えることなく、1つの表示エリア内のあるアクティビティから別のアクティビティに切り替えるにはどうすればよいですか?

PlaceControllerのgoToを使用して1つの領域の1つのプレイスから別のプレイスに切り替えると、他の領域のアクティビティは停止します。

メーデー、お手伝いください、mayday!

AppViewImpl.ui.xml

<g:DockLayoutPanel styleName="{style.dockPanel}" unit="PX" width="975px" height="100%"> 

    <!-- DOCK PANEL EAST --> 
    <g:east size="220"> 
     <g:LayoutPanel styleName="{style.eastPanel}"> 
      <g:layer left="0px" width="220px" top="0px" height="105px"> 
       <g:SimpleLayoutPanel ui:field="topRightPanel"/> 
      </g:layer> 

      <g:layer left="0px" width="220px" top="110px" height="340px"> 
        <g:InlineLabel styleName="{style.label}" text="ANOTHER DISPLAY AREA"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:east> 

    <!-- DOCK PANEL NORTH --> 
    <g:north size="110"> 
     <g:LayoutPanel styleName="{style.northPanel}"> 
      <g:layer left="0px" width="755px" top="0px" height="105px"> 
        <g:InlineLabel styleName="{style.label}" text="NORTH PANEL"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:north> 

    <!-- DOCK PANEL SOUTH --> 
    <g:south size="20"> 
     <g:LayoutPanel styleName="{style.southPanel}"> 
      <g:layer left="0px" width="755px" top="0px" height="20px"> 
        <g:InlineLabel styleName="{style.label}" text="SOUTH PANEL"/> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:south> 

    <!-- DOCK PANEL CENTER --> 
    <g:center> 
     <g:SimpleLayoutPanel ui:field="mainPanel" /> 
    </g:center> 
</g:DockLayoutPanel> 

MyModule.java

パブリッククラスMyModuleというが{

private Place defaultPlace = new DefaultPlace(""); 

public void onModuleLoad() { 
    // Create ClientFactory using deferred binding so we can replace with 
    // different impls in gwt.xml 
    ClientFactory clientFactory = GWT.create(ClientFactory.class); 
    EventBus eventBus = clientFactory.getEventBus(); 
    PlaceController placeController = clientFactory.getPlaceController(); 

    // Start ActivityManager for the main widget with our ActivityMapper 
    ActivityMapper topRightActivityMapper = new TopRightActivityMapper(clientFactory); 
    ActivityManager topRightActivityManager = new ActivityManager(topRightActivityMapper, eventBus); 
    topRightActivityManager.setDisplay(clientFactory.getAppView().getTopRightPanel()); 

    // Start ActivityManager for the main widget with our ActivityMapper 
    ActivityMapper mainActivityMapper = new AppActivityMapper(clientFactory); 
    ActivityManager mainActivityManager = new ActivityManager(mainActivityMapper, eventBus); 
    mainActivityManager.setDisplay(clientFactory.getAppView().getMainPanel()); 

    // Start PlaceHistoryHandler with our PlaceHistoryMapper 
    AppPlaceHistoryMapper historyMapper = GWT .create(AppPlaceHistoryMapper.class); 
    PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper); 
    historyHandler.register(placeController, eventBus, defaultPlace); 
    RootLayoutPanel.get().add(clientFactory.getAppView()); 

    // Goes to place represented on URL or default place 
    historyHandler.handleCurrentHistory(); 

    new AppController(clientFactory); 
} 

}エントリーポイントを実装する:以下

は、自分のコードの一部であります

AppController.java

public class AppController implements AppView.Presenter { 

    private ClientFactory clientFactory; 

    AppController(ClientFactory clientFactory){ 
     this.clientFactory = clientFactory; 
     goTo(new TopRightAPlace("")); 
    } 

    @Override 
    public void goTo(Place place) { 
     clientFactory.getPlaceController().goTo(place); 
    } 

} 

TopRightAViewImpl.java

public class TopRightAViewImpl extends Composite implements TopRightAView { 

    interface Binder extends UiBinder<Widget, TopRightAViewImpl> { 
    } 

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

    private Presenter listener; 
    @UiField 
    Button button; 

    public TopRightAViewImpl() { 
     initWidget(binder.createAndBindUi(this)); 
    } 

    @Override 
    public void setName(String name) { 
     button.setHTML(name); 
    } 

    @Override 
    public void setPresenter(Presenter listener) { 
     this.listener = listener; 
    } 

    @UiHandler("button") 
    void onButtonClick(ClickEvent event) { 
     listener.goTo(some other place); 
    } 
} 

答えて

9

GWT Places PlaceControllerPlaceHistoryMapperを使用すると、アプリケーション内にブックマーク可能なURLを作成して、ブラウザの戻るボタンとブックマークを期待通りに動作させることができます。これは、GWT Placeが設計されたものです。したがって、アプリケーション全体に1つのURLがあるため、任意の時点でアプリケーション内に複数のPlaceがアクティブになることは意味がありません。

PlaceControllerの方法は、登録されたActivityManagerを通知します。これは、PlaceChangeEventを受信すると現在のアクティビティを停止します。

DockLayoutPanelの東側の2つの領域には、PlacePlaceChangeEventを使用しないでください。あなたのアプリケーションのメイン画面にPlaceを使用してください。これはおそらくDockLayoutPanelの中心です。東側の領域を更新する必要がある場合は、GwtEventタイプの汎用イベントタイプ(つまり、ValueChangeEvent)またはカスタムイベントタイプのいずれかをタイプします。あなたはまだ東側にActivitieを使用することができますが、実際にはそれほど難しくない独自のActivityManagerを作成する必要があります。GWTのActivityManagerをコピーして名前を変更し、PlaceChangeEventPlaceChangeRequestEventを扱うメソッドの名前を、自分のイベントを処理するメソッドの名前に置き換えるだけです。

+0

これはまさに私がやったことです。ありがとう! – Pete

1

あなたが本当にGoogleのMVPの実装を使用してもよろしいですか? mvp4gを使用してこのメ​​カニズムを実装するのは簡単ではありません。メインモジュールはメインビューを初期化し、ダイナミックエリアをリロードするロジックを提供します。私はこのフレームワークを2つの大きなプロジェクトで使い、魅力のように働きました。

関連する問題