1
我是Java中的初學者。我正在嘗試使用DOM解析器從XML文件(本例中爲helloWorld.xml)動態填充JTree。我把幫助我的代碼從流動主題:Creating a JTree out of an XML document using DOM parser使用DOM解析器將樹節點填充到XML文檔中的JTree中
package java_img_parser.jtrees;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLTree extends JTree {
DefaultTreeModel dm;
JTree tree = new JTree(dm);
public XMLTree() throws SAXException, IOException {
this.dm = treeBuilder();
}
public DefaultTreeModel treeBuilder() throws SAXException, IOException{
Node root = null;
DefaultTreeModel dtModel = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse("helloWorld.xml");
root = (Node)doc.getDocumentElement();
} catch (ParserConfigurationException ex) {
Logger.getLogger(XMLTree.class.getName()).log(Level.SEVERE, null, ex);
}
if(root != null){
dtModel = new DefaultTreeModel(makeTree(root));
dtModel.reload();
}
return dtModel;
}
private DefaultMutableTreeNode makeTree(Node root){
DefaultMutableTreeNode rootTreeNode;
rootTreeNode = new DefaultMutableTreeNode(root.getNodeName());
NodeList nodeList = root.getChildNodes();
for(int count=0;count<nodeList.getLength();count++){
Node tempNode = nodeList.item(count);
if(tempNode.getNodeType() == Node.ELEMENT_NODE){
if(tempNode.hasChildNodes()){
rootTreeNode.add(makeTree(tempNode));
}
}
}
System.out.println("Child-Node of"+root.getParentNode()+"is"+root.getChildNodes());
return rootTreeNode;
}
public static void main(String args[]) throws SAXException, IOException{
JFrame myFrame = new JFrame();
myFrame.setTitle("XmlJTreeExample");
myFrame.setSize(300, 500);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setLocationRelativeTo(null);
XMLTree myTree = new XMLTree();
System.out.println("Height of this JTree is:" + myTree.tree.getHeight());
myFrame.add(myTree.tree);
myFrame.setVisible(true);
}
}
當我做一個println()我可以看到,子節點正在運行。但同樣的節點沒有被添加到我的JTree(它顯示零(0)高度)。
我的源XML文件是一樣的,在上述螺紋:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE people SYSTEM "validator.dtd">
<people>
<student>
<name>John</name>
<course>Computer Technology</course>
<semester>6</semester>
<scheme>E</scheme>
</student>
<student>
<name>Foo</name>
<course>Industrial Electronics</course>
<semester>6</semester>
<scheme>E</scheme>
</student>
</people>
輸出我得到的是一個空白的JFrame,這在輸出控制檯: 運行:
Child-Node of[student: null]is[name: null]
Child-Node of[student: null]is[course: null]
Child-Node of[student: null]is[semester: null]
Child-Node of[student: null]is[scheme: null]
Child-Node of[people: null]is[student: null]
Child-Node of[student: null]is[name: null]
Child-Node of[student: null]is[course: null]
Child-Node of[student: null]is[semester: null]
Child-Node of[student: null]is[scheme: null]
Child-Node of[people: null]is[student: null]
Child-Node of[#document: null]is[people: null]
Height of this JTree is:0
BUILD SUCCESSFUL (total time: 23 seconds)
'公共類XMLTree擴展JTree的{ 「不是一個好主意,也不是必需的。 'JTree tree = new JTree(dm);'這更加怪異的原因有兩個,一個是,你已經從'JTree'延伸,所以不知道你爲什麼要創建另一個實例,而兩個'dm'是'null' – MadProgrammer
@MadProgrammer謝謝。是的,我的'XMLTree'類不需要從'JTree'擴展。我已經省略了那部分。但從我的理解,我分配'dm'從'treeBuilder()'方法返回的treemodel'dtModel'。所以,你的意思是'dtModel'保持爲空,並且在這裏沒有修改:'if(root!= null){dtmodel = new DefaultTreeModel(makeTree(root)); dtModel.reload(); }' –
'dtModel = new DefaultTreeModel(makeTree(root))'意味着JTree是什麼? – MadProgrammer