樹(shù)是c/s應(yīng)用程序界面上的常見(jiàn)控件,在web上,實(shí)現(xiàn)一棵樹(shù)通常需要css和div的配合,實(shí)現(xiàn)一個(gè)ajax特性的樹(shù)還需要ajax知識(shí)。ice:tree實(shí)現(xiàn)了這些功能。ice:tree的官方文檔參考:
http://facestutorials.icefaces.org/tutorial/tree-tutorial.html。本篇文章要彌補(bǔ)官方指南的不足,解釋清楚對(duì)象模型,并提供一個(gè)接口,幫助簡(jiǎn)化事件攔截機(jī)制。
在我的應(yīng)用程序中,有一棵樹(shù),根結(jié)點(diǎn)為"標(biāo)準(zhǔn)短語(yǔ)庫(kù)",右鍵選擇該節(jié)點(diǎn)后,可以創(chuàng)建新短語(yǔ)庫(kù),新創(chuàng)建的短語(yǔ)庫(kù)作為根結(jié)點(diǎn)的子節(jié)點(diǎn)。右鍵點(diǎn)擊某個(gè)短語(yǔ)庫(kù),可以選擇”刪除“、“重命名”菜單。左鍵單擊某個(gè)短語(yǔ)庫(kù),右邊表格將顯示短語(yǔ)庫(kù)中的短語(yǔ)。
ice:tree的value屬性必須通過(guò)getXX方法獲取接口javax.swing.tree.TreeModel。我們可以自己實(shí)現(xiàn)TreeModel,不過(guò)大多數(shù)情況下我們使用javax.swing.tree.DefaultTreeModel類。先來(lái)看一下頁(yè)面代碼:
DefaultTreeModel對(duì)象要包含一個(gè)根節(jié)點(diǎn)--一個(gè)DefaultMutableTreeNode對(duì)象。DefaultMutableTreeNode類的add方法可以加入子節(jié)點(diǎn)。DefaultMutableTreeNode對(duì)象的setUserObject方法可以讓我們將IceUserObject對(duì)象或者子類對(duì)象放入其中。IceUserObject就是用于存儲(chǔ)樹(shù)節(jié)點(diǎn)的數(shù)據(jù)的,提供了setText,setExpanded等方法。為了方便攔截樹(shù)的點(diǎn)擊事件,我擴(kuò)展了IceUserObject類,可以從后面的代碼中看到。
private void loadTree() throws DBConnectionException, SQLException {
DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
MyIceUserObject rootObject = new MyIceUserObject(rootTreeNode);
rootObject.setText("標(biāo)準(zhǔn)短語(yǔ)庫(kù)");
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函數(shù)用于初始化短語(yǔ)庫(kù)樹(shù)的所有節(jié)點(diǎn)。MyIceUserObject的addTreeEventListener將當(dāng)前managed bean的this指針加入到事件偵聽(tīng)列表中,managed bean必須實(shí)現(xiàn)TreeEventListener接口的方法,該方法將會(huì)在發(fā)生了點(diǎn)擊事件的時(shí)候被調(diào)用:
public void clickItem(MyIceUserObject source) {
}
現(xiàn)在來(lái)看一下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);
}
關(guān)于右鍵單擊出現(xiàn)上下文菜單的內(nèi)容,在我前面的"ice:panelGroup應(yīng)用"文章中已經(jīng)描述過(guò),這里不再贅述。
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇