首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GWT CellTree @UIHandler SelectionChanged

GWT CellTree @UIHandler SelectionChanged
EN

Stack Overflow用户
提问于 2013-08-13 13:55:37
回答 1查看 310关注 0票数 0

我正在使用GWT CellTree类,并且希望能够在选择更改时更新页面上的另一个UI元素。

我有这个:

代码语言:javascript
复制
@UiField (provided = true)
CellTree folderTree;

在页面加载中填充数据,然后需要@UIiHandler,如下所示:

代码语言:javascript
复制
@UiHandler("folderTree")
void onTreeCellChange(????? e){
    //update UI    
}

我已经尝试过这样的方法:

代码语言:javascript
复制
ValueChangeEvent<List<Folder>> //List<Folder> being the underlying class for the CellTree.
SelectionHandler<CellTree>
ClickEvent

在所有上述情况下,在表单加载时,我都会发现延迟绑定失败。我觉得我错过了一些简单的东西,但似乎找不到我的google-fu。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-13 17:18:57

您可以向NodeInfo of TreeViewModel of CellTree添加处理程序。

下面是可以这样做的例子:

首先,让我们定义什么是文件夹:

代码语言:javascript
复制
// the simplest possible folder even without subfolders just to make example working
public class Folder {
    private String name;

    public Folder(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

假设您的ui.xml的一部分如下所示:

代码语言:javascript
复制
<g:HorizontalPanel>
    <cellview:CellTree ui:field="folderTree"/>
    <g:Label ui:field="folderName"/>
</g:HorizontalPanel>

比你拥有的UiBinder:

代码语言:javascript
复制
public static interface Binder extends UiBinder<HorizontalPanel, BinderOwner> {}

下面是如何定义您的FolerTreeModel所需的CellTree:

代码语言:javascript
复制
public static class FolderTreeModel implements TreeViewModel {
    private final ListDataProvider<Folder> dataProvider;
    private final CellPreviewEvent.Handler<Folder> folderSelectionHandler;

    public FolderTreeModel(List<Folder> folders, CellPreviewEvent.Handler<Folder> folderSelectionHandler) {
        this.folderSelectionHandler = folderSelectionHandler;
        dataProvider = new ListDataProvider<Folder>(folders);
    }

    @Override
    public <T> TreeViewModel.NodeInfo<?> getNodeInfo(T value) {
        return new DefaultNodeInfo<Folder>(dataProvider, new AbstractCell<Folder>() {
            // simple renderer that renders folder name
            @Override 
            public void render(Context context, Folder value, SafeHtmlBuilder sb) {
                sb.appendEscaped(value.getName());
            }
        }, 
        new SingleSelectionModel<Folder>(), // using single selection model
        folderSelectionHandler, // add handler to the node info
        null); // value updater can be null
    }

    @Override
    public boolean isLeaf(Object value) {
        return false; // I will say that every node is not leaf for simplicity 
    }
 }

你的BinderOwner课程:

代码语言:javascript
复制
public static class BinderOwner {
    @UiField(provided = true)
    CellTree folderTree;
    @UiField
    Label folderName; //your other UI element that you will change: show the name of selected folder

    public BinderOwner() {
         //List of folders to show something
         ArrayList<Folder> folders = new ArrayList<Folder>();
         folders.add(new Folder("A"));
         folders.add(new Folder("B"));
         folders.add(new Folder("C"));

         // define folder tree
         folderTree = new CellTree(new FolderTreeModel(folders, new CellPreviewEvent.Handler<Folder>() {
             // this is your handler
             @Override 
             public void onCellPreview(CellPreviewEvent<Folder> event) {
                 // set folder name to label on folder selection
                 folderName.setText(event.getValue().getName());
             }
         }), null);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18211084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档