樹是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應用"文章中已經描述過,這裡不再贅述。