在你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)
}
}
感謝您的答覆......我想我失去了一些東西,因爲我認爲selectionModel的是強類型的。因此,對於根節點,您必須通過selectionModel,對於第二級,您必須傳入selectionModel 。我將如何解決這個問題?提前致謝。 –
hba
沒錯。然而,作爲一種解決方法,您可以創建一個實現ProviderKey接口的抽象Base類(BaseModel)。你所有的DTO都擴展了這個BaseModel類。 (請參閱我的答案更新) –
我結束了一個不同的方法。我創建了一個可容納3個selectionModel的SelectionModelController。在玩這個小部件幾天後,我意識到它不需要我的其他需求,所以我寫了自己的。再次感謝。 – hba