Я пытаюсь изменить пример кода GWT 2.1 HelloMVP, чтобы использовать более сложный интерфейс. (Я не могу предоставить ссылку из-за ограничения в две ссылки)
Моя проблема в том, что ActivityManager.setDisplay принимает только объекты, которые реализуют AcceptsOneWidget. LayoutPanel и другие ComplexPanel не поддерживают AcceptsOneWidget. В примере кода вместо этого используется SimplePanel. Но я не могу вкладывать сложные виджеты в SimplePanel (они не отображаются).
Я нашел несколько обсуждений по этой проблеме:
http://www.google.com/url?sa=D&q=https://stackoverflow.com/questions/5143196/is-there-a-acceptsonewidget-which-also-providesresze-other-than-scrollpanel%3Fanswertab%3Dactive%23tab-top
http://www.google.com/url?sa=D&q=http://www.tempura.org/rants/2010/10/using-layoutpanels-with-gwt-2-1s-activitymanager/
Люди предполагают, что решение состоит в создании подкласса ComplexPanel, который я хочу, который реализует интерфейс AcceptsOneWidget. Вот так:
public class PanelForView extends LayoutPanel implements AcceptsOneWidget {
IsWidget myWidget = null;
@Override
public void setWidget(IsWidget w) {
if (myWidget != w) {
if (myWidget != null) {
remove(myWidget);
}
if (w != null) {
add(w);
}
myWidget = w;
}
}
}
Звучит замечательно, но, похоже, у меня не работает. Возможно, потому что я использую GWT 2.3 вместо 2.1 или 2.2. В моей EntryPoint я ожидаю просто заменить SimplePanel моим новым классом PanelForView и запустить приложение, как раньше. Вот так:
public class HelloMVP implements EntryPoint {
private Place defaultPlace = new HelloPlace("World!");
// private SimplePanel appWidget = new SimplePanel(); // Replace this with PanelForView
private PanelForView appWidget = new PanelForView(); // This compiles but doesn't work.
// private SimpleLayoutPanel appWidget = new SimpleLayoutPanel(); // This doesn't work either.
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 activityMapper = new AppActivityMapper(clientFactory);
ActivityManager activityManager = new ActivityManager(activityMapper, eventBus);
activityManager.setDisplay(appWidget);
// Start PlaceHistoryHandler with our PlaceHistoryMapper
AppPlaceHistoryMapper historyMapper= GWT.create(AppPlaceHistoryMapper.class);
PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper);
historyHandler.register(placeController, eventBus, defaultPlace);
RootPanel.get().add(appWidget);
// Goes to place represented on URL or default place
historyHandler.handleCurrentHistory();
}
}
Это компилируется нормально, но когда я запускаю его, я вижу только пустой экран. Что-то еще, что я должен сделать, чтобы инициализировать ComplexPanel? Я просто что-то недопонимаю? Я попытался добавить виджеты и вызвать setSize безрезультатно. Это мой первый проект GWT.
Спасибо за ваше время.
Corey