2013-01-15 150 views
0

我正在探索一些常見問題的可能解決方案(歡迎您的輸入)。爲了清楚起見,我簡化了這個問題。GWT - 動態頁面大小

比方說,我有一個顯示號碼的矩形框的小部件。每個盒子具有相同的靜態寬度&高。有很多盒子超過1000個,這個數字會隨着時間的推移而增長。

我想使用分頁顯示的箱子。我想要一個避免使用滾動條。所以我想根據頁面大小動態更改每個頁面上顯示的框的數量。

什麼是解決這個問題的最好方法,起初我以爲如果container-widget實現RequiresResizeI should be able to capture the dimensions of the widget。但我想我需要讓每個家長部件也實現RequiresResizeProvidesResize

有沒有更好的方法?

感謝

回答

1

這是更簡單:

Window.addResizeHandler(new ResizeHandler() { 

    @Override 
    public void onResize(ResizeEvent event) { 
     resize(); 
    } 

}); 

private void resize() { 
     // Measure your widget 
     // Decide how many squares to display 
} 

您將需要調用調整()時,您的視圖首次加載,然後任何窗口大小調整將觸發此方法爲好。

0

你只需要實現RequiresResize和維護提供/ RequiresResize鏈如果想調整事件。但在你的情況,你只是想知道窗口或容器的大小,而不是調整大小事件(至少,這是我從你的問題推斷)。

在這種情況下,您可以在決定分頁之前使用容器小部件的getOffsetWidth()和getOffsetHeight()方法(請參閱http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user/client/ui/UIObject.html#getOffsetHeight())。

在另一方面,如果再需要重新佈局的事情,當窗口大小的變化,那麼你必須像你說的使用提供/ RequireResize。如果您不想維護完整的層次結構,只需在根佈局面板中放置一個隱藏的LayoutPanel,然後將resize事件路由到任何您想要的。不是一個非常乾淨的解決方案,而是一個解決方案......

2

在一個香草GWT項目去獲得這種最簡單的方法是使用佈局面板類 - 這些使用你所提到的RequiresResizeProvidesResize接口。最好的方法是開始使用RootPanel而不是RootLayoutPanel。這個替代的起點包裝一個RootPanel實例,並通過調用RequiresResize.onResize(如果存在)將它的子級調整到可用的瀏覽器空間。

小部件樹的其餘部分(孩子們加入到父母,等等),那麼也應該使用這些接口來聲明,他們需要調整的信息。很有可能你最終不會建立任何不支持的小部件,而是通常將現有的小部件(通過UiBinder或Composite)包裝到一個新的小部件中 - 這就是你正在製作一個新小部件的技巧,以及默認一個不執行ProvidesResizeRequiresResize。當你構建你的應用程序時,有兩個基本的解決方案:

  • 實現這兩個接口。然後,在您的onResize()方法中,調用需要知道其大小已更改的頂級小部件的onResize()。這允許更多的控制,但需要更明確的代碼來進行大小調整。最簡單的方法是擴展ResizeComposite而不是Composite。或者,

  • 請勿擴展Widget(即不要擴展Composite/ResizeComposite/etc),而應實施IsWidget。這樣可以避免在樹中添加新的Widget類型,並將所有正在使用的小部件分組到一個恰好構建並設置它們的類型中。這是我的首選選項 - 它看起來不像一個小部件,通常更容易模擬,等等。現在,您需要有一個asWidget()方法返回您的小部件結構的基礎 - 任何添加的東西都會直接與此對話(並直接調用它的onResize()),讓你忽略他們需要交互的細節。這是我的首選。

+0

感謝您的明確解釋......然而,我認爲安德烈的解決方案將爲我工作。 – hba