2011-09-26 127 views
0

我正在嘗試使用GWT CellTree來顯示異構的分層數據模型。我需要能夠進行單個選擇,但能夠選擇父節點以及子節點。例如,如果您查看GWT自己的example,則會看到它們僅爲離開節點提供一種選擇模型。GWT CellTree選擇父節點

我試圖通過爲所有節點提供一個選擇模型來擴展他們的示例。但是,這似乎是不可能的。所以我最終選擇了3種SelectionModels,每種節點類型(Composer,PlayList,Song)。

我錯過了什麼?

在此先感謝。

回答

1

在你TreeViewModel的getNodeInfo功能你必須給selectionModel每一級傳遞給每一個新DefaultNodeInfo實例。

return new DefaultNodeInfo<MyDTO>(dataProvider,new MyDTOCell(),selectionModel,null); 

,然後你有這樣做的SelectionChangeEventHandler:

selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { 
    @Override 
    public void onSelectionChange(SelectionChangeEvent event) { 
     Object object = selectionModel.getSelectedObject(); 
     if (object instanceof MyRootDTO) 
     { 
       // DO SOMETHING with root level selected node 
     } 
     else if (object instanceof MySecondLevelDTO) { 
     // DO SOMETHING WITH 2. level selected node 
     } 
     // additional levels 
}); 

更新
爲了避開打字的問題,你可以定義一個抽象基類,這是由所有的DTO擴展。

public abstract class BaseModel { 

    public static final ProvidesKey<BaseModel> KEY_PROVIDER = new ProvidesKey<BaseModel>() { 
     public Object getKey(BaseModel item) { 
     return item == null ? null : item.getId(); 
     } 
    }; 

    public abstract Object getId(); 
} 

在你的DTO的你延長BaseModel和實現抽象getId()方法:

public class MyDTO extends BaseModel { 
     @Override 
     public Object getId() { 
      //return unique ID (i.e. MyDTO_1) 
     } 
} 
+0

感謝您的答覆......我想我失去了一些東西,因爲我認爲selectionModel的是強類型的。因此,對於根節點,您必須通過selectionModel ,對於第二級,您必須傳入selectionModel 。我將如何解決這個問題?提前致謝。 – hba

+0

沒錯。然而,作爲一種解決方法,您可以創建一個實現ProviderKey接口的抽象Base類(BaseModel)。你所有的DTO都擴展了這個BaseModel類。 (請參閱我的答案更新) –

+0

我結束了一個不同的方法。我創建了一個可容納3個selectionModel的SelectionModelController。在玩這個小部件幾天後,我意識到它不需要我的其他需求,所以我寫了自己的。再次感謝。 – hba