How to I properly use ActivityMapper/ActivityManager in order to position views displayed on a main page layout?
This app attempts to display its 3 views on the main display page, as follows:
- the AAAView at the "top of page"
- the BBBView at the "middle of page"
- the CCCView at the "bottom of page"
PROBLEM: Though the app runs, it does NOT position the views (i.e., "AAAView", "BBBView", "CCCView") as described above.
(For example, the "AAAView" is displayed at the "bottom of page" and the "BBBView" and "CCCView" are displayed in the "middle of page"...--Why is this?)
I assume that the problem is a result of my mis-using (misunderstanding?) the ActivityMapper/ActivityManager classes to place (or position) the views/panels properly on the main page.
Unfortunately, I have not been able to locate any comprehensive documentation on how to use the ActivityMapper/ActivityManager classes properly/effectively. (The examples apps I've seen thus far have generally been too complex for me to isolate exactly how the ActivityMapper/ActivityManager classes work to specify where a panel/view displays on a main page)
The code used in the app is shown, below...
(any advice or explanation of what I am doing wrong would be very appreciated.... --And, I imagine that I am not the only person struggling with this concept)
Thankyou for any help!!
/src/aaa/bbb/ccc/app.gwt.xml
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='app'>
<inherits name='com.google.gwt.user.User' />
<inherits name='com.google.gwt.user.theme.standard.Standard' />
<inherits name="com.google.gwt.activity.Activity" />
<inherits name="com.google.gwt.place.Place" />
<entry-point class='aaa.bbb.ccc.client.AppEntryPoint' />
<source path='client' />
<source path='shared' />
</module>
/src/aaa/bbb/ccc/client/AppEntryPoint
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.ActivityManager;
public class AppEntryPoint extends LayoutPanel implements EntryPoint
{
private LayoutPanel mainView = null;
interface AppEntryPointUiBinder extends UiBinder<LayoutPanel, AppEntryPoint>
{
}
private static AppEntryPointUiBinder uiBinder = GWT.create(AppEntryPointUiBinder.class);
@UiField
SimplePanel topOfPage;
@UiField
SimplePanel middleOfPage;
@UiField
SimplePanel bottomOfPage;
public AppEntryPoint()
{
super();
}
AcceptsOneWidget top = new AcceptsOneWidget()
{
public void setWidget(IsWidget activityWidget)
{
Widget widget = Widget.asWidgetOrNull(activityWidget);
mainView.setWidgetVisible(topOfPage, widget != null);
topOfPage.setWidget(widget);
}
};
AcceptsOneWidget mid = new AcceptsOneWidget()
{
public void setWidget(IsWidget activityWidget)
{
Widget widget = Widget.asWidgetOrNull(activityWidget);
mainView.setWidgetVisible(middleOfPage, widget != null);
middleOfPage.setWidget(widget);
}
};
AcceptsOneWidget bot = new AcceptsOneWidget()
{
public void setWidget(IsWidget activityWidget)
{
Widget widget = Widget.asWidgetOrNull(activityWidget);
mainView.setWidgetVisible(bottomOfPage, widget != null);
bottomOfPage.setWidget(widget);
}
};
public void onModuleLoad()
{
ClientFactory clientFactory = GWT.create(ClientFactory.class);
mainView = uiBinder.createAndBindUi(this);
EventBus eventBus = clientFactory.getEventBus();
ActivityMapper aaaActivityMapper = new AAAActivityMapper(clientFactory);
ActivityManager aaaActivityManager = new ActivityManager(aaaActivityMapper, eventBus);
aaaActivityManager.setDisplay(top);
ActivityMapper bbbActivityMapper = new BBBActivityMapper(clientFactory);
ActivityManager bbbActivityManager = new ActivityManager(bbbActivityMapper, eventBus);
bbbActivityManager.setDisplay(mid);
ActivityMapper cccActivityMapper = new CCCActivityMapper(clientFactory);
ActivityManager cccActivityManager = new ActivityManager(cccActivityMapper, eventBus);
cccActivityManager.setDisplay(bot);
AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);
PlaceController placeController = clientFactory.getPlaceController();
PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
historyHandler.register(placeController, eventBus, new AAAPlace());
RootLayoutPanel.get().add(mainView);
historyHandler.handleCurrentHistory();
}
}
/src/aaa/bbb/ccc/client/AppEntryPoint.ui.xml
<!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' xmlns:h='urn:import:aaa.bbb.ccc.client'>
<ui:style src="app.css" />
<g:LayoutPanel width="800" height='600'>
<g:layer left='10%' right='10%' top='4px' height='10em'>
<g:SimplePanel ui:field="topOfPage"/>
</g:layer>
<g:layer left='10%' right='10%' top='204px' height='10em'>
<g:SimplePanel ui:field="middleOfPage"/>
</g:layer>
<g:layer left='10%' right='10%' top='404px' height='10em'>
<g:SimplePanel ui:field="bottomOfPage"/>
</g:layer>
</g:LayoutPanel>
</ui:UiBinder>
/src/aaa/bbb/ccc/client/ClientFactory.java
package aaa.bbb.ccc.client;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.place.shared.PlaceController;
public class ClientFactory
{
public ClientFactory()
{
}
private static final EventBus eventBus = new SimpleEventBus();
private static final PlaceController placeController = new PlaceController(eventBus);
private static final AAAView aaaView = new AAAView();
private static final BBBView bbbView = new BBBView();
private static final CCCView cccView = new CCCView();
public EventBus getEventBus()
{
return eventBus;
}
public PlaceController getPlaceController()
{
return placeController;
}
public AAAView getAAAView()
{
return aaaView;
}
public BBBView getBBBView()
{
return bbbView;
}
public CCCView getCCCView()
{
return cccView;
}
}
/src/aaa/bbb/ccc/client/AppPlaceHistoryMapper.java
package aaa.bbb.ccc.client;
import com.google.gwt.place.shared.PlaceHistoryMapper;
import com.google.gwt.place.shared.WithTokenizers;
@WithTokenizers({AAAPlace.Tokenizer.class, BBBPlace.Tokenizer.class })
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper
{
}
/src/aaa/bbb/ccc/client/AAAView.java
package aaa.bbb.ccc.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField开发者_JAVA技巧;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class AAAView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
private final HTMLPanel aaaView;
private Presenter presenter;
private static AAAViewUiBinder uiBinder = GWT.create(AAAViewUiBinder.class);
interface AAAViewUiBinder extends UiBinder<HTMLPanel, AAAView>
{
}
public AAAView()
{
aaaView = uiBinder.createAndBindUi(this);
}
@UiField
Label aaaViewLabel;
@UiField
Button bbbButton;
@UiHandler("bbbButton")
void onBBBButtonClicked(ClickEvent event)
{
presenter.gotoBBBPlace();
}
@UiField
Button cccButton;
@UiHandler("cccButton")
void onCCCButtonClicked(ClickEvent event)
{
presenter.gotoCCCPlace();
}
public void setName(String name)
{
aaaViewLabel.setText(name);
}
public void setPresenter(Presenter presenter)
{
this.presenter = presenter;
}
public interface Presenter
{
void gotoBBBPlace();
void gotoCCCPlace();
}
@Override
public Widget asWidget()
{
return aaaView;
}
}
/src/aaa/bbb/ccc/client/AAAView.ui.xml
<!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 src="app.css" />
<g:HTMLPanel ui:field="aaaView" styleName='{style.aaaView}'>
<g:Label ui:field="aaaViewLabel" text="AAAView" styleName='{style.viewLabel}'></g:Label>
<g:Button ui:field="bbbButton" text="go to bbbView"></g:Button>
<g:Button ui:field="cccButton" text="go to cccView"></g:Button>
</g:HTMLPanel>
</ui:UiBinder>
/src/aaa/bbb/ccc/client/AAAActivity.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class AAAActivity extends AbstractActivity implements AAAView.Presenter
{
private String name = "...the AAAView...";
private final AAAView aaaView;
private final PlaceController placeController;
public AAAActivity(ClientFactory clientFactory)
{
aaaView = clientFactory.getAAAView();
placeController = clientFactory.getPlaceController();
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus)
{
aaaView.setPresenter(this);
aaaView.setName(name);
panel.setWidget(aaaView.asWidget());
}
@Override
public void gotoBBBPlace()
{
placeController.goTo(new BBBPlace());
}
@Override
public void gotoCCCPlace()
{
placeController.goTo(new CCCPlace());
}
}
/src/aaa/bbb/ccc/client/AAAActivityMapper.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;
public class AAAActivityMapper implements ActivityMapper
{
private ClientFactory clientFactory;
public AAAActivityMapper(ClientFactory clientFactory)
{
this.clientFactory = clientFactory;
}
@Override
public Activity getActivity(Place place)
{
if (place instanceof BBBPlace)
{
return new BBBActivity(clientFactory);//return bbbActivityMapper.getActivity(place);
}
else
if (place instanceof CCCPlace)
{
return new CCCActivity(clientFactory);//return cccActivityMapper.getActivity(place);
}
return null;
}
}
/src/aaa/bbb/ccc/client/AAAPlace.java
package aaa.bbb.ccc.client;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;
public class AAAPlace extends Place
{
private String aaaName = "AAAPlace";
public AAAPlace()
{
}
public String getAAAName()
{
return aaaName;
}
@Prefix("AAAPlace")
public static class Tokenizer implements PlaceTokenizer<AAAPlace>
{
@Override
public String getToken(AAAPlace place)
{
return place.getAAAName(); //"AAAName"; //place.getAAAName();
}
@Override
public AAAPlace getPlace(String token)
{
return new AAAPlace();
}
}
}
/src/aaa/bbb/ccc/client/BBBView.java
package aaa.bbb.ccc.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class BBBView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
private final HTMLPanel bbbView;
private Presenter presenter;
private static BBBViewUiBinder uiBinder = GWT.create(BBBViewUiBinder.class);
interface BBBViewUiBinder extends UiBinder<HTMLPanel, BBBView>
{
}
public BBBView()
{
bbbView = uiBinder.createAndBindUi(this);
}
@UiField
Label bbbViewLabel;
@UiField
Button aaaButton;
@UiHandler("aaaButton")
void onAAAButtonClicked(ClickEvent event)
{
presenter.gotoAAAPlace();
}
@UiField
Button cccButton;
@UiHandler("cccButton")
void onCCCButtonClicked(ClickEvent event)
{
presenter.gotoCCCPlace();
}
public void setName(String name)
{
bbbViewLabel.setText(name);
}
public void setPresenter(Presenter presenter)
{
this.presenter = presenter;
}
public interface Presenter
{
void gotoAAAPlace();
void gotoCCCPlace();
}
@Override
public Widget asWidget()
{
return bbbView;
}
}
/src/aaa/bbb/ccc/client/BBBView.ui.xml
<!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 src="app.css" />
<g:HTMLPanel ui:field="bbbView" styleName='{style.bbbView}'>
<g:Label ui:field="bbbViewLabel" text="BBBView" styleName='{style.viewLabel}'></g:Label>
<g:Button ui:field="aaaButton" text="go to aaaView"></g:Button>
<g:Button ui:field="cccButton" text="go to cccView"></g:Button>
</g:HTMLPanel>
</ui:UiBinder>
/src/aaa/bbb/ccc/client/BBBActivity.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class BBBActivity extends AbstractActivity implements BBBView.Presenter
{
private String name = "...the BBBView...";
private final BBBView bbbView;
private final PlaceController placeController;
public BBBActivity(ClientFactory clientFactory)
{
bbbView = clientFactory.getBBBView();
placeController = clientFactory.getPlaceController();
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus)
{
bbbView.setPresenter(this);
bbbView.setName(name);
panel.setWidget(bbbView.asWidget());
}
@Override
public void gotoAAAPlace()
{
placeController.goTo(new AAAPlace());
}
@Override
public void gotoCCCPlace()
{
placeController.goTo(new CCCPlace());
}
}
/src/aaa/bbb/ccc/client/BBBActivityMapper.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;
public class BBBActivityMapper implements ActivityMapper
{
private ClientFactory clientFactory;
public BBBActivityMapper(ClientFactory clientFactory)
{
this.clientFactory = clientFactory;
}
@Override
public Activity getActivity(Place place)
{
if (place instanceof AAAPlace)
{
return new AAAActivity(clientFactory);//aaaActivityMapper.getActivity(place);
}
else
if (place instanceof CCCPlace)
{
return new CCCActivity(clientFactory);//return cccActivityMapper.getActivity(place);
}
return null;
}
}
/src/aaa/bbb/ccc/client/BBBPlace.java
package aaa.bbb.ccc.client;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;
public class BBBPlace extends Place
{
private String bbbName = "BBBPlace";
public BBBPlace()
{
}
public String getBBBName()
{
return bbbName;
}
@Prefix("BBBPlace")
public static class Tokenizer implements PlaceTokenizer<BBBPlace>
{
@Override
public String getToken(BBBPlace place)
{
return place.getBBBName(); //"BBBName"; //place.getBBBName();
}
@Override
public BBBPlace getPlace(String token)
{
return new BBBPlace();
}
}
}
/src/aaa/bbb/ccc/client/CCCView.java
package aaa.bbb.ccc.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
public class CCCView extends SimplePanel implements IsWidget, AcceptsOneWidget
{
private final HTMLPanel cccView;
private Presenter presenter;
private static CCCViewUiBinder uiBinder = GWT.create(CCCViewUiBinder.class);
interface CCCViewUiBinder extends UiBinder<HTMLPanel, CCCView>
{
}
public CCCView()
{
cccView = uiBinder.createAndBindUi(this);
}
@UiField
Label cccViewLabel;
@UiField
Button aaaButton;
@UiHandler("aaaButton")
void onAAAButtonClicked(ClickEvent event)
{
presenter.gotoAAAPlace();
}
@UiField
Button bbbButton;
@UiHandler("bbbButton")
void onBBBButtonClicked(ClickEvent event)
{
presenter.gotoBBBPlace();
}
public void setName(String name)
{
cccViewLabel.setText(name);
}
public void setPresenter(Presenter presenter)
{
this.presenter = presenter;
}
public interface Presenter
{
void gotoAAAPlace();
void gotoBBBPlace();
}
@Override
public Widget asWidget()
{
return cccView;
}
}
/src/aaa/bbb/ccc/client/BBBView.ui.xml
<!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 src="app.css" />
<g:HTMLPanel ui:field="cccView" styleName='{style.cccView}'>
<g:Label ui:field="cccViewLabel" text="CCCView" styleName='{style.viewLabel}'></g:Label>
<g:Button ui:field="aaaButton" text="go to aaaView"></g:Button>
<g:Button ui:field="bbbButton" text="go to bbbView"></g:Button>
</g:HTMLPanel>
</ui:UiBinder>
/src/aaa/bbb/ccc/client/CCCActivity.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class CCCActivity extends AbstractActivity implements CCCView.Presenter
{
private String name = "...the CCCView...";
private final CCCView cccView;
private final PlaceController placeController;
public CCCActivity(ClientFactory clientFactory)
{
cccView = clientFactory.getCCCView();
placeController = clientFactory.getPlaceController();
}
@Override
public void start(AcceptsOneWidget panel, EventBus eventBus)
{
cccView.setPresenter(this);
cccView.setName(name);
panel.setWidget(cccView.asWidget());
}
@Override
public void gotoAAAPlace()
{
placeController.goTo(new AAAPlace());
}
@Override
public void gotoBBBPlace()
{
placeController.goTo(new BBBPlace());
}
}
/src/aaa/bbb/ccc/client/CCCActivityMapper.java
package aaa.bbb.ccc.client;
import com.google.gwt.activity.shared.Activity;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.place.shared.Place;
public class CCCActivityMapper implements ActivityMapper
{
private ClientFactory clientFactory;
public CCCActivityMapper(ClientFactory clientFactory)
{
this.clientFactory = clientFactory;
}
@Override
public Activity getActivity(Place place)
{
if (place instanceof AAAPlace)
{
return new AAAActivity(clientFactory);//return aaaActivityMapper.getActivity(place);
}
else
if (place instanceof BBBPlace)
{
return new BBBActivity(clientFactory);//return aaaActivityMapper.getActivity(place);
}
return null;
}
}
/src/aaa/bbb/ccc/client/CCCPlace.java
package aaa.bbb.ccc.client;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceTokenizer;
import com.google.gwt.place.shared.Prefix;
public class CCCPlace extends Place
{
private String cccName = "CCCPlace";
public CCCPlace()
{
}
public String getCCCName()
{
return cccName;
}
@Prefix("CCCPlace")
public static class Tokenizer implements PlaceTokenizer<CCCPlace>
{
@Override
public String getToken(CCCPlace place)
{
return place.getCCCName(); //"CCCName"; //place.getCCCName();
}
@Override
public CCCPlace getPlace(String token)
{
return new CCCPlace();
}
}
}
/src/aaa/bbb/ccc/client/app.css
h1 {
font-size: 2em;
font-weight: bold;
color: #777777;
margin: 40px 0px 70px;
text-align: center;
}
.aaaView {
border-color: black;
border-width: 2 px;
background-color: navy;
width: 75%;
height: 25%;
}
.viewLabel {
color:white;
font-size: 24px;
font-style: italic;
font-weight: bolder;
border-width: 2 px;
}
.bbbView {
border-color: black;
border-width: 2 px;
background-color: blue;
width: 75%;
height: 25%;
}
.cccView {
border-color: black;
border-width: 2 px;
background-color: lightblue;
width: 75%;
height: 25%;
}
.layer1 {
border-color: red;
border-width: 2 px;
background-color: yellow;
width: 100%;
height: 33%;
}
.layer2 {
border-color: teal;
border-width: 2 px;
background-color: green;
width: 100%;
height: 33%;
}
.layer3 {
border-color: grey;
border-width: 2 px;
background-color: aqua;
width: 100%;
height: 33%;
}
.gwt-layer {
border-color: grey;
border-width: 2 px;
background-color: aqua;
width: 100%;
height: 33%;
}
/war/app.html
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>app</title>
<script type="text/javascript" language="javascript" src="app/app.nocache.js"></script>
</head>
<body>
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
<noscript>
<div style="width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif">
Your web browser must have JavaScript enabled
in order for this application to display correctly.
</div>
</noscript>
</body>
</html>
/war/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>app</display-name>
<welcome-file-list>
<welcome-file>app.html</welcome-file>
</welcome-file-list>
</web-app>
The problem is in your ActivityMapper
s.
When you go to an AAAPlace
(which is the default place, so the one used when you don't have any history token in the URL):
AAAActivityMapper
returnsnull
which (given theaaaActivityManager
) will hide thetopOfPage
areaBBBActivityMapper
returns anAAAActivity
, which will display the (singleton)AAAView
in themiddleOfPage
areaCCCActivityMapper
returns anotherAAAActivity
, which will display the (singleton)AAAView
in thebottomOfPage
area Because theAAAView
is a widget, it can only be shown at a single place at a time. And because it's a singleton, the lastsetWidget
will win (it'll remove the widget from it's previous parent before adding it to the new one). Because you initializedcccActivityManager
afterbbbActivityManager
, and event handlers are called in registration order, thebot
will win. That leaves you with a hiddentopOfPage
, an emptymiddleOfPage
(not hidden becausemid
was called with a non-empty value, but just after thatbot
is called with the same widget, and therefore steals it frommiddleOfPage
to put it intobottomOfPage
), and anAAAView
in thebottomOfPage
.
Shameless plug: have a look at http://blog.ltgt.net/gwt-21-activities/ (and sibling articles about places and activities). I hope it'll help you understand how it all works.
精彩评论