项目中要用一个复合树,对叶子节点需要能够进行复选,对于根或枝节点为了不需要复选框,也没去找其它办法,自己想了一个,也许不是很好,仅为给自己记一事吧,以后有时间再深入研究一下,看有没有更好的办法了。
总体思路是这样的,前台JS的代码跟平常的Ext树没有任何差别,差别在后台给前台数据的时候控制节点有没有复选框,控制方法就是作用类继续机制,叶子节点为子类型扩展普通节点,子类添加了一个属性checked,这样它就会有一个复选框了,设置为true即为选中状态。
Action方法:其中代码并不优美
页面JS代码:
自己把代码一贴上来这样一看觉得代码还真乱,有待学习和进步。
总体思路是这样的,前台JS的代码跟平常的Ext树没有任何差别,差别在后台给前台数据的时候控制节点有没有复选框,控制方法就是作用类继续机制,叶子节点为子类型扩展普通节点,子类添加了一个属性checked,这样它就会有一个复选框了,设置为true即为选中状态。
Action方法:其中代码并不优美
public ActionForward setStamp(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
try {
final String parentID = request.getParameter("node").trim();
IStampService stampService = getStampService();
List<Stamp> subStamps = stampService.getByParentId(Long.valueOf(parentID));
List<TreeNodeBean> ts = new ArrayList<TreeNodeBean>();
boolean b = false;
for(Stamp s:subStamps){
//判断是不是叶子节点
b = stampService.isLeaf(s);
TreeNodeBean t;
if(b){
//是叶子节点就构造子类
t = new ComplexCheckTreeNodeBean();
boolean bb = eventStampService.isChecked(s.getId(), eventDetailId);
((ComplexCheckTreeNodeBean)t).setChecked(bb);
}else{
t = new TreeNodeBean();
}
//设置节点值
t.setId(s.getId());
t.setText(s.getStampName());
t.setLeaf(b);
ts.add(t);
}
//用的是JSON-lib生成JSON数据
JSONArray json = JSONArray.fromObject(ts);
response.setBufferSize(1024*10);
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(json.toString());
response.flushBuffer();
getLogger().debug(json.toString());
return null;
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
页面JS代码:
[/coExt.onReady(function(){
Ext.SSL_SECURE_URL = "../ext/resources/images/default/s.gif";
Ext.BLANK_IMAGE_URL = "../ext/resources/images/default/s.gif";
tree = new Ext.tree.TreePanel({
el:"stamptree",
autoHeight:false,
autoWidth:false,
rootVisible:true,
title:'标签管理',
useArrows:true,
autoScroll:true,
animate:true,
enableDD:true,
containerScroll:true,
border:false,
loader:new Ext.tree.TreeLoader({
dataUrl:"../stamp/stamp.do?method=setStamp“
})
});
var root = new Ext.tree.AsyncTreeNode({
id:1,
text:"根",
qtip:"根标签",
allowDrag:false,
allowDrop:false
});
tree.setRootNode(root);
tree.render();
root.expand();
});
自己把代码一贴上来这样一看觉得代码还真乱,有待学习和进步。