2011-06-10 31 views
1

我試圖修改GWT 2.1 HelloMVP示例代碼以使用更復雜的用戶界面。 (由於兩個鏈接限制,我不允許提供鏈接)我如何使用ComplexPanel與GWT ActivityManager

我的問題是ActivityManager.setDisplay只接受實現AcceptsOneWidget的對象。 LayoutPanel和其他ComplexPanel不實現AcceptsOneWidget。示例代碼改爲使用SimplePanel。但我似乎無法在SimplePanel中嵌套複雜的Widget(它們不顯示)。

我發現對這個問題的一些討論:

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?我只是誤解了一些東西?我試着添加Widgets並調用setSize無濟於事。這是我的第一個GWT項目。

謝謝你的時間。

科瑞

+0

嘗試刪除if語句'如果(進myWidget!= W)' – 2011-06-11 14:05:59

回答

2

你應該能夠很容易地使用SimplePanel(或複合子類實現AcceptsOneWidget)。做到這一點的最佳方式是思考包含的小部件。您可以將一個:HTMLPanel,FlowPanel,VerticalPanel等添加到SimplePanel的一個控件區域中。

然而,一旦你這樣做,你是彎曲的預期用途的ActivityMapper/AcceptsOneWidget/SimplePanel

你可以通過創建一個更復雜的用戶界面:

添加另一個ActivityMapper(用不同的UI區域 - SimplePanel - 這應該從地方改變的地方)或添加Widget的區域(即不從地方改變的地方)

或*

讓你的活動控制更復雜的視圖(保留ActivityMapper.setDisplay小部件的一個SimplePanel - 但然後讓活動設置一個HTMLPanel,VerticalPanel等)

一個非常流行的實現是保持一個SimplePanel作爲ActivityMapper的內容區域。然後使用UiBinder的(與HTMLPanel作爲頂級元素)

我們可以調用UiBinder的:「視圖」,並且它可以有許多區域

view.getTopArea() - SimplePanel, view.getLeft() - FlowPanel, view.getNameArea - Anchor/InlineHTML 

所有這些不同的元件被包裝成圖,該可一個複合

,然後在你的

activity.start(AcceptsOneWidget panel){ 
panel.setWidget(view);//insert your complex view into the SimplePanel view 
    ... 
} 
+0

感謝阿什頓,你提到的第二個方法就是我心目中原本。但我必須考慮第一個。 – Corey 2011-06-13 23:02:56

0

好了,當我有這個問題,我只是用自帶的樣品AP的非常簡單的UI試驗頁。

我也嘗試保持SimplePanel並讓Activity返回一個由標籤和圖像組成的HeaderPanel(在Ashton的Answer中提到的第二種方法)。我認爲這不起作用。我在博客和論壇上看到似乎表明這不起作用的評論。但是一旦我開始用DockPanel和嵌套的TabPanel等來構建UI,突然間所有事情都開始正常顯示。我不知道爲什麼。這可能是我的代碼中的一個錯誤,我想。但我現在正在路上。我不在乎回去並確切地診斷出錯的地方。 :)

感謝您的建議傢伙!

科瑞

0

使用RootLayoutPanel而不是RootPanel

+0

你能詳細說明爲什麼要這樣做嗎? – Ren 2012-11-15 09:16:42