ice:tree应用

树是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应用"文章中已经描述过,这里不再赘述。

你可能感兴趣的:(tree)