Java GWT CellTree@UIHandler SelectionChanged

Java GWT CellTree@UIHandler SelectionChanged,java,gwt,Java,Gwt,我正在使用GWT CellTree类,我希望能够在选择更改时更新页面上的另一个UI元素 我有这个: @UiField (provided = true) CellTree folderTree; 我在页面加载中填充数据,然后我需要@UIiHandler,类似于: @UiHandler("folderTree") void onTreeCellChange(????? e){ //update UI } 我已经尝试过以下方法: ValueChangeEvent<List&

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

我有这个:

@UiField (provided = true)
CellTree folderTree;
我在页面加载中填充数据,然后我需要@UIiHandler,类似于:

@UiHandler("folderTree")
void onTreeCellChange(????? e){
    //update UI    
}
我已经尝试过以下方法:

ValueChangeEvent<List<Folder>> //List<Folder> being the underlying class for the CellTree.
SelectionHandler<CellTree>
ClickEvent
ValueChangeEvent//List是CellTree的基础类。
选择处理器
点击事件
在上述所有情况下,我得到的延迟绑定在表单加载时失败。
我觉得我错过了一些简单的东西,但我的google fu似乎找不到它。

你可以在CellTree的TreeView模型的节点信息中添加处理程序

下面是一个示例,说明如何执行以下操作:

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

// 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的一部分如下所示:

<g:HorizontalPanel>
    <cellview:CellTree ui:field="folderTree"/>
    <g:Label ui:field="folderName"/>
</g:HorizontalPanel>

比您的UiBinder:

public static interface Binder extends UiBinder<HorizontalPanel, BinderOwner> {}
公共静态接口绑定器扩展UiBinder{}
以下是如何定义CellTree所需的FolerTreeModel:

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 
    }
 }
公共静态类FolderTreeModel实现TreeViewModel{
私有最终列表数据提供者数据提供者;
私有最终CellPreviewEvent.Handler folderSelectionHandler;
公共FolderTreeModel(列表文件夹,CellPreviewEvent.Handler folderSelectionHandler){
this.folderSelectionHandler=folderSelectionHandler;
dataProvider=新列表dataProvider(文件夹);
}
@凌驾
public TreeViewModel.NodeInfo getNodeInfo(T值){
返回新的DefaultNodeInfo(dataProvider,new AbstractCell()){
//呈现文件夹名称的简单渲染器
@凌驾
公共void呈现(上下文上下文、文件夹值、SafeHtmlBuilder sb){
sb.appender(value.getName());
}
}, 
新的SingleSelectionModel(),//使用单一选择模型
folderSelectionHandler,//将处理程序添加到节点信息
null);//值更新程序可以为null
}
@凌驾
公共布尔isLeaf(对象值){
return false;//为了简单起见,我要说不是每个节点都是叶子
}
}
以及您的BinderOwner类:

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);
    }
}
公共静态类BinderOwner{
@UiField(提供的=真)
CellTree folderTree;
@尤菲尔德
Label folderName;//要更改的其他UI元素:显示所选文件夹的名称
公共绑定所有者(){
//要显示内容的文件夹列表
ArrayList folders=新建ArrayList();
文件夹。添加(新文件夹(“A”);
文件夹。添加(新文件夹(“B”);
文件夹。添加(新文件夹(“C”);
//定义文件夹树
folderTree=new CellTree(new FolderTreeModel(folders,new CellPreviewEvent.Handler()){
//这是你的接线员
@凌驾
公共void onCellPreview(CellPreviewEvent事件){
//将文件夹名称设置为文件夹选择上的标签
folderName.setText(event.getValue().getName());
}
}),空);
}
}

那么,我可以在表单上添加类似的内容吗@UiHandler(“folderTree”)void onTreeCellChange(SelectionChangeEvent e){}之后您将不需要@UiHandler,因为您将在onSelectionChange()方法中实现它。如果使用UiBinder,您可以使用多种方法添加处理程序。其中之一是对handler方法使用@UiHandler注释。如果GWT从UiBinder xml模板为您创建组件,这种方法是很好的。另一种方法是手动创建组件,就像使用@UiField(provided=true)一样。在本例中,您可以在组件创建期间直接在Java代码中添加处理程序,如我的示例所示。我稍微澄清了这个问题,但我的目标是更新页面上的另一个UI元素,这可能吗?是的,这是可能的。我改变了我的答案,向你们展示了如何做到这一点的具体例子。