?? treeobject.java
字號(hào):
package com.socialite.bizlogic.tree;
import com.socialite.bizlogic.tree.TreeNodeObject;
import com.socialite.bizlogic.util.XMLObject;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.HashMap;
import java.util.ArrayList;
/*
DynamicTreeDemo:
rootNode = new DefaultMutableTreeNode("Root Node");
treeModel = new DefaultTreeModel(rootNode);
treeModel.addTreeModelListener(new MyTreeModelListener());
tree = new JTree(treeModel);
tree.setEditable(true);
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setShowsRootHandles(true);
By explicitly creating the tree's model, the code guarantees
that the tree's model is an instance of DefaultTreeModel. That
way, we know all the methods that the tree model supports. For
example, we know that we can invoke the model's insertNodeInto
method, even though that method is not required by the TreeModel
interface.
*/
//TreeObject的同步,ArrayList,HashMap對(duì)象的同步還沒(méi)有考慮(考慮了前者,后者應(yīng)該就有保證了)
public class TreeObject{
private DefaultTreeModel dfModel;
private TreeNodeObject node;
private DefaultMutableTreeNode fatherDfNode=null;
private TreeNodeObject rootNode=null;
private DefaultMutableTreeNode dfNode;
private static HashMap hMap=new HashMap(200);
private ArrayList aList=new ArrayList();
//構(gòu)造函數(shù),組裝DefaultTreeModel
public TreeObject(XMLObject xmlTree){
String c=xmlTree.getValue("bizlogic.resultparameter.count");
int count=0;
if(c==null){
//什么也不做,此時(shí)rootNode==null
}else{
try{
count=Integer.parseInt(c);
}catch(NumberFormatException e){
return;//什么也不做,此時(shí)rootNode==null
}
}
//先以根節(jié)點(diǎn)構(gòu)造一個(gè)DefaultTreeModel
String node_id="0";
String father_id=null;
String name="Root";
String url=null;
//以rootNode為根節(jié)點(diǎn)構(gòu)造一個(gè)DefaultTreeModel樹(shù)對(duì)象
rootNode=new TreeNodeObject(node_id,father_id,name,url);
dfNode=new DefaultMutableTreeNode(rootNode);
dfModel=new DefaultTreeModel(dfNode);
//HashMap中添加node_id到dfNode的映射
hMap.put(node_id,dfNode);
//開(kāi)始組裝樹(shù)
for(int i=1;i<=count;i++){
node_id=xmlTree.getValue("bizlogic.resultparameter.node_id"+i);
father_id=xmlTree.getValue("bizlogic.resultparameter.father_id"+i);
name=xmlTree.getValue("bizlogic.resultparameter.name"+i);
url=xmlTree.getValue("bizlogic.resultparameter.url"+i);
//構(gòu)造一個(gè)TreeNodeObject對(duì)象
node=new TreeNodeObject(node_id,father_id,name,url);
//以node對(duì)象為UserObject構(gòu)造一DefaultMutableTreeNode
dfNode=new DefaultMutableTreeNode(node);
if(!(node_id.trim().equalsIgnoreCase("0"))){//不是root
//查找父親節(jié)點(diǎn)
fatherDfNode=(DefaultMutableTreeNode)hMap.get(father_id);
if(fatherDfNode!=null){//找到則添加為子節(jié)點(diǎn)
fatherDfNode.add(dfNode);
//HashMap中添加node_id到dfNode的映射
hMap.put(node_id,dfNode);
}else{//找不到則先將TreeNodeObject類(lèi)型對(duì)象node放入ArrayList
aList.add(node);
}
}
}
//多次遍歷ArrayList,將沒(méi)有組裝到樹(shù)中的節(jié)點(diǎn)組裝
while(!(aList.isEmpty())){
int aListSize=aList.size();
for(int i=0;i<aListSize;i++){
node=(TreeNodeObject)aList.get(i);
dfNode=new DefaultMutableTreeNode(node);
node_id=node.getNodeId();
father_id=node.getFatherId();
//查找父親節(jié)點(diǎn)
fatherDfNode=(DefaultMutableTreeNode)hMap.get(father_id);
if(fatherDfNode!=null){//找到則添加為子節(jié)點(diǎn)
fatherDfNode.add(dfNode);
//HashMap中添加node_id到dfNode的映射
hMap.put(node_id,dfNode);
//刪除ArrayList中該節(jié)點(diǎn)
aList.remove(i);
}
}
}
}
/*
*
* 判斷是否組裝了實(shí)際的樹(shù)
*/
/*ublic boolean isExist(){
if(!rootNode==null){
return true;
}
return false;
}
*/
//增加新節(jié)點(diǎn)
public void addNode(TreeNodeObject who){
DefaultMutableTreeNode fatherDfNode=null;
DefaultMutableTreeNode dfNode=null;
String node_id=who.getNodeId();
String father_id=who.getFatherId();
dfNode=new DefaultMutableTreeNode(who);
fatherDfNode=(DefaultMutableTreeNode)hMap.get(father_id);
fatherDfNode.add(dfNode);//執(zhí)行增加子節(jié)點(diǎn)
//HashMap中添加node_id到dfNode的映射
hMap.put(node_id,dfNode);
}
//刪除節(jié)點(diǎn),如果是非葉子節(jié)點(diǎn)則子樹(shù)一起刪除
public void deleteNode(TreeNodeObject who){
DefaultMutableTreeNode dfNode=null;
String node_id=who.getNodeId();
//從hashMap中得到要?jiǎng)h除的對(duì)象
dfNode=(DefaultMutableTreeNode)hMap.get(node_id);
//修改hashMap
//???更新HashMap,此時(shí)已經(jīng)被刪除的子樹(shù)中節(jié)點(diǎn)已經(jīng)不存在,hMap對(duì)應(yīng)的值應(yīng)該是null???
//hMap.remove(node_id);//這種方法行嗎,需要用下面的第歸方法嗎
removeObjectFromHashMap(node_id);
//Removes the subtree rooted at this node from the tree, giving this node a null parent.
dfNode.removeFromParent();//從樹(shù)中刪除該節(jié)點(diǎn)對(duì)應(yīng)的子樹(shù)
}
//第歸刪除HashMap中的節(jié)點(diǎn)
private void removeObjectFromHashMap(String whoId){
DefaultMutableTreeNode dfNode=null;
//String node_id=who.getNodeId();
//從hashMap中得到要?jiǎng)h除的mapping
dfNode=(DefaultMutableTreeNode)hMap.get(whoId);
DefaultMutableTreeNode dfChild=null;
TreeNodeObject child=null;
String node_id=null;
int childCount=dfNode.getChildCount();
if(childCount==0){
hMap.remove(whoId);
}else{
for(int i=1;i<childCount;i++){
//得到DefaultMutableTreeNode,轉(zhuǎn)化為T(mén)reeNodeObject,得到node_id
dfChild=(DefaultMutableTreeNode)dfNode.getChildAt(i);
child=(TreeNodeObject)dfChild.getUserObject();
node_id=child.getNodeId();
//第歸調(diào)用
removeObjectFromHashMap(node_id);
}
}
}
//修改節(jié)點(diǎn)(node_id是不能變的),father_id也不能改變,如果要改變father_id,以后實(shí)現(xiàn)move方法
public void modifyNode(TreeNodeObject newNode){
DefaultMutableTreeNode dfNode=null;
TreeNodeObject node=null;
String node_id=newNode.getNodeId();
//從hashMap中得到要修改的對(duì)象
dfNode=(DefaultMutableTreeNode)hMap.get(node_id);
node=(TreeNodeObject)dfNode.getUserObject();
//String old_father_id=node.getFatherId();
//String new_node_id=newNode.getNodeId();
//String new_father_id=newNode.getFatherId();
String new_name=newNode.getName();
String new_url=newNode.getUrl();
node.setName(new_name);
node.setUrl(new_url);
//下面的工作還需要嗎
dfNode=new DefaultMutableTreeNode(node);
hMap.put(node_id,dfNode);
}
}
/*
TreeObject.java的幾個(gè)問(wèn)題:
(1)第93行,108行,119行,124行。
看出來(lái)問(wèn)題沒(méi)有?93和119無(wú)論結(jié)點(diǎn)是否能在散列表中找到父結(jié)點(diǎn),都創(chuàng)建一個(gè)DefaultMutableTreeNode,不錯(cuò)但效率低下。應(yīng)當(dāng)在找到父結(jié)點(diǎn)之后(100和125的for循環(huán)內(nèi)部)才創(chuàng)建一個(gè)DefaultMutableTreeNode表示子結(jié)點(diǎn)。
(2)117到134的for循環(huán)
有問(wèn)題。如果132行remove一個(gè)元素,將導(dǎo)致后續(xù)元素整體向前挪動(dòng)。導(dǎo)致問(wèn)題一:整體挪動(dòng)效率低下。問(wèn)題二:下標(biāo)i++將使得一個(gè)元素在這趟for循環(huán)中無(wú)法訪問(wèn)到。
解決辦法一:仍然使用ArrayList,針對(duì)第二個(gè)問(wèn)題,在132行之后加一個(gè)i--。
解決辦法二:將aList定義為鏈表LinkedList,而不是ArrayList;并且不要通過(guò)get(int),而是通過(guò)迭代器ListIterator的next()和remove()。
(3)115行開(kāi)始的while循環(huán)
有死循環(huán)的可能性。如果一趟while循環(huán)沒(méi)有使得aList元素個(gè)數(shù)減少呢?所以在while循環(huán)外部首先記錄aList長(zhǎng)度,在循環(huán)內(nèi)部最后判斷aList長(zhǎng)度是否發(fā)生了變化,如果未變化則跳出while循環(huán)(接下來(lái)該怎么處理,你自己決定)。
(4)178的疑問(wèn)
應(yīng)該用你定義的遞歸方法removeObjectFromHashMap,這樣刪除得徹底。
(5)242的疑問(wèn)
不需要。因?yàn)槟闶菍?duì)散列表中的對(duì)象調(diào)用方法,并不影響散列表今后的查找。
(6)221的move方法,比較容易,你應(yīng)該會(huì)寫(xiě)吧。
注:這幾點(diǎn)在v2中修改
*/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -