2010-04-13 58 views
1

在我的GWT項目中,我試圖獲取它,因此兩個DialogBoxes可以在對方之間傳遞信息。其中一個包含MapWidget,當在另一個DialogBox中按下按鈕時,位置信息從另一個DialogBox的MapWidget中接收。有沒有人有任何提示,我應該如何協調兩個不同的DialogBoxes出現?我是否應該將兩者的代碼包裝在Composite中?此外,GWT中有沒有一個例子可以同時處理兩個對話框?例如,如果我點擊兩個框外,都應該被解僱。我想知道是否有辦法讓他們一次都集中注意力,所以我可以在兩者之間切換而不會導致消失。在GWT中連接兩個對話框

回答

1

共享對話框之間數據

在我看來,「正確」的方式做,這將是實現在應用某種MVP structure使演示管理視圖(DialogBox ES,中其他的東西),並知道如何將簡單的數據傳遞給視圖來顯示(演示者將處理MapWidget數據,該視圖將負責將其顯示在DOM上)。

不過,如果你正在尋找一個更快/更簡單的方法,你有兩個選擇(你選擇真的取決於應用程序結構):

  1. 創建Composite,正如你所提到,知道如何來回傳遞必要的數據。通過讓Composite管理數據對象並告訴兩個DialogBox如何顯示它,您實際上正在接近您的Composite中的MVP體系結構。
  2. 子類DialogBox轉換爲包含HandlerManager(有時用作「事件總線」)的類,該按鈕在按下按鈕時觸發事件。您可以創建旨在在兩個DialogBox es之間來回傳遞數據的事件(即使使用類型參數使它們類型安全)。有關使用HandlerManager的詳細信息,請參閱this StackOverflow question。上面鏈接的MVP文章也有一些good information on using an event bus

Model-View-Presenter是一種經過實踐驗證的構建應用程序的方法,可以生成更多可測試的代碼,更好的項目結構,並且可以在做出這樣的決策時爲您提供指導。我強烈建議您檢查一下,如果你還沒有。

共享自動隱藏功能

GWT的​​(上DialogBox的原型)提供了一個方法addAutoHidePartner(Element)這也是正是如此描述:一個自動隱藏的合作伙伴中出現不會隱藏

鼠標事件面板設置爲自動隱藏。

所以,你只能創建接近當你點擊之外他們兩個兩個自動隱藏DialogBox ES(例如,他們沒有當您在任的箱子點擊關閉),用下面的代碼:

// Create the dialog boxes 
DialogBox dbox1 = new DialogBox(true, false); 
DialogBox dbox2 = new DialogBox(true, false); 
// Set some visual options 
dbox1.setPopupPosition(10, 10); 
dbox2.setPopupPosition(200, 10); 
dbox1.setAnimationEnabled(true); 
dbox2.setAnimationEnabled(false); 
// Set the dialog boxes' caption and content 
dbox1.setHTML("Dialog Box 1"); 
dbox2.setHTML("Dialog Box 2"); 
dbox1.setWidget(new HTML("This is the first dialog box.")); 
dbox2.setWidget(new HTML("This is the second dialog box.")); 
// Making dobx2 a partner of dbox1 means clicking 
// in dbox2 won't cause dbox1 to close 
dbox1.addAutoHidePartner(dbox2.getElement()); 
// Similarly, setting dbox1 as a partner of dbox2 means 
// clicking in dbox1 won't cause dbox2 to close 
dbox2.addAutoHidePartner(dbox1.getElement()); 
// Show the dialog boxes 
dbox1.show(); 
dbox2.show(); 

您可以與其中任一個對話框進行交互,而無需其他關閉。如果您只想要單向合作伙伴關係,請忽略撥打setAutoHidePartner的適當電話。

+0

非常感謝,它的工作原理!唯一的問題是,似乎我無法爲兩個對話框都設置setGlassEnabled(true)。好吧。 – 2010-04-26 17:28:15

+0

很高興聽到它!你可以考慮重載'show()'來檢查是否顯示另一個'DialogBox'並且啓用了玻璃,並且在調用父'show()'之前以編程方式設置玻璃的啓用狀態。這將允許您在任何時候顯示一個或兩個「DialogBox」時啓用玻璃。 (當然,當盒子被解散時,你也必須檢查玻璃狀態。) – 2010-04-29 01:54:12