树是c/s应用程序界面上的常见控件,在web上,实现一棵树通常需要css和div的配合,实现一个ajax特性的树还需要ajax知识。ice:tree实现了这些功能。ice:tree的官方文档参考:
http://facestutorials.icefaces.org/tutorial/tree-tutorial.html。本篇文章要弥补官方指南的不足,解释清楚对象模型,并提供一个接口,帮助简化事件拦截机制。
在我的应用程序中,有一棵树,根结点为"标准短语库",右键选择该节点后,可以创建新短语库,新创建的短语库作为根结点的子节点。右键点击某个短语库,可以选择”删除“、“重命名”菜单。左键单击某个短语库,右边表格将显示短语库中的短语。
ice:tree的value属性必须通过getXX方法获取接口javax.swing.tree.TreeModel。我们可以自己实现TreeModel,不过大多数情况下我们使用javax.swing.tree.DefaultTreeModel类。先来看一下页面代码:
DefaultTreeModel对象要包含一个根节点--一个DefaultMutableTreeNode对象。DefaultMutableTreeNode类的add方法可以加入子节点。DefaultMutableTreeNode对象的setUserObject方法可以让我们将IceUserObject对象或者子类对象放入其中。IceUserObject就是用于存储树节点的数据的,提供了setText,setExpanded等方法。为了方便拦截树的点击事件,我扩展了IceUserObject类,可以从后面的代码中看到。
private void loadTree() throws DBConnectionException, SQLException {
DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
MyIceUserObject rootObject = new MyIceUserObject(rootTreeNode);
rootObject.setText("标准短语库");
rootObject.setExpanded(true);
rootObject.addTreeEventListener(this);
rootTreeNode.setUserObject(rootObject);
treeModel = new DefaultTreeModel(rootTreeNode);
List libraries = StandardPhraseLibraryManager.load();
for (StandardPhraseLibrary library : libraries) {
DefaultMutableTreeNode branchNode = new DefaultMutableTreeNode();
MyIceUserObject branchObject = new MyIceUserObject(branchNode);
branchObject.setText(library.getName());
branchObject.addTreeEventListener(this);
branchNode.setUserObject(branchObject);
rootTreeNode.add(branchNode);
}
}
loadTree函数用于初始化短语库树的所有节点。MyIceUserObject的addTreeEventListener将当前managed bean的this指针加入到事件侦听列表中,managed bean必须实现TreeEventListener接口的方法,该方法将会在发生了点击事件的时候被调用:
public void clickItem(MyIceUserObject source) {
}
现在来看一下MyIceUserObject类的代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Freebird.Helper;
import com.icesoft.faces.component.tree.IceUserObject;
import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.swing.tree.DefaultMutableTreeNode;
/**
*
* @author freebird
*/
public class MyIceUserObject extends IceUserObject{
public MyIceUserObject(DefaultMutableTreeNode wrapper){
super(wrapper);
}
private List listeners=new ArrayList();
public void addTreeEventListener(TreeEventListener listener){
listeners.add(listener);
}
private Object data;
/**
* @return the data
*/
public Object getData() {
return data;
}
/**
* @param data the data to set
*/
public void setData(Object data) {
this.data = data;
}
public void clickItem(ActionEvent ev){
for(TreeEventListener listener : listeners){
listener.clickItem(this);
}
}
}
TreeEventListener接口代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Freebird.Helper;
/**
*
* @author freebird
*/
public interface TreeEventListener {
public void clickItem(MyIceUserObject source);
}
关于右键单击出现上下文菜单的内容,在我前面的"ice:panelGroup应用"文章中已经描述过,这里不再赘述。
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛