java叶节点是什么(java中jtree双击叶节点如何获取该文件所在的路径)
大家好,今天来为大家分享java叶节点是什么的一些知识点,和java中jtree双击叶节点如何获取该文件所在的路径的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
java 动态的给树添加新节点 望高手指点啊
//先选中节点才能增加节点
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
public class TreeTest implements ActionListener,TreeModelListener{
JLabel label=null;
JTree tree=null;
DefaultTreeModel treeModel=null;
String nodeName=null;//原有节点名称
public TreeTest(){
JFrame f=new JFrame("TreeTest");
Container contentPane=f.getContentPane();
DefaultMutableTreeNode root=new DefaultMutableTreeNode("资源管理器");
tree=new JTree(root);
tree.setEditable(true);
tree.addMouseListener(new MouseHandle());
treeModel=(DefaultTreeModel)tree.getModel();
treeModel.addTreeModelListener(this);
JScrollPane scrollPane=new JScrollPane();
scrollPane.setViewportView(tree);
JPanel panel=new JPanel();
JButton b=new JButton("新增节点");
b.addActionListener(this);
panel.add(b);
b=new JButton("删除节点");
b.addActionListener(this);
panel.add(b);
b=new JButton("清除所有节点");
b.addActionListener(this);
panel.add(b);
label=new JLabel("Action");
contentPane.add(panel,BorderLayout.NORTH);
contentPane.add(scrollPane,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
//本方法运行新增、删除、清除所有节点的程序代码.
public void actionPerformed(ActionEvent ae){
if(ae.getActionCommand().equals("新增节点")){
DefaultMutableTreeNode parentNode=null;
DefaultMutableTreeNode newNode=new DefaultMutableTreeNode("新节点");
newNode.setAllowsChildren(true);
TreePath parentPath=tree.getSelectionPath();
//取得新节点的父节点
parentNode=(DefaultMutableTreeNode)(parentPath.getLastPathComponent());
//由DefaultTreeModel的insertNodeInto()方法增加新节点
treeModel.insertNodeInto(newNode,parentNode,parentNode.getChildCount());
//tree的scrollPathToVisible()方法在使Tree会自动展开文件夹以便显示所加入的新节点。若没加这行则加入的新节点
//会被包在文件夹中,你必须自行展开文件夹才看得到。
tree.scrollPathToVisible(new TreePath(newNode.getPath()));
label.setText("新增节点成功");
}
if(ae.getActionCommand().equals("删除节点")){
TreePath treepath=tree.getSelectionPath();
if(treepath!=null){
//下面两行取得选取节点的父节点.
DefaultMutableTreeNode selectionNode=(DefaultMutableTreeNode)treepath.getLastPathComponent();
TreeNode parent=(TreeNode)selectionNode.getParent();
if(parent!=null){
//由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。
treeModel.removeNodeFromParent(selectionNode);
label.setText("删除节点成功");
}
}
}
if(ae.getActionCommand().equals("清除所有节点")){
//下面一行,由DefaultTreeModel的getRoot()方法取得根节点.
DefaultMutableTreeNode rootNode=(DefaultMutableTreeNode)treeModel.getRoot();
//下面一行删除所有子节点.
rootNode.removeAllChildren();
//删除完后务必运行DefaultTreeModel的reload()操作,整个Tree的节点才会真正被删除.
treeModel.reload();
label.setText("清除所有节点成功");
}
}
public void treeNodesChanged(TreeModelEvent e){
TreePath treePath=e.getTreePath();
DefaultMutableTreeNode node=(DefaultMutableTreeNode)treePath.getLastPathComponent();
try{
int[] index=e.getChildIndices();
node=(DefaultMutableTreeNode)node.getChildAt(index[0]);
}catch(NullPointerException exc){}
label.setText(nodeName+"更改数据为:"+(String)node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e){
System.out.println("new node insered");
}
public void treeNodesRemoved(TreeModelEvent e){
System.out.println("node deleted");
}
public void treeStructureChanged(TreeModelEvent e){
System.out.println("Structrue changed");
}
public static void main(String[] args){
new TreeTest();
}
class MouseHandle extends MouseAdapter{
public void mousePressed(MouseEvent e){
try{
JTree tree=(JTree)e.getSource();
int rowLocation=tree.getRowForLocation(e.getX(),e.getY());
TreePath treepath=tree.getPathForRow(rowLocation);
TreeNode treenode=(TreeNode)treepath.getLastPathComponent();
nodeName=treenode.toString();
}catch(NullPointerException ne){}
}
}
}
Java生成树中的从根到叶子节点的所有路径
方法是在dfs的过程中维护dfs的路径,到达叶子结点时将路径加入到答案中,具体见代码的注释。
输入格式为:
7A
AB
CA
DB
EB
CF
CG
其中,第一行表示结点数量n和根结点编号,第[2..n+ 1]行每行两个字符u和v,表示树边。
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Scanner;
publicclassMain{
staticfinalintmaxn=1000;
intn;//树的结点个数
charroot;//树的根
List<List<Character>>ans=newArrayList<List<Character>>();//结果,存放所有路径
boolean[][]G=newboolean[maxn][maxn];//邻接矩阵
/**
*dfs
*@paramu当前到达的结点
*@paramfa当前结点的父节点
*@parampath根到fa的路径
*/
voiddfs(charu,charfa,List<Character>path){
path.add(u);
booleanleaf=true;//u为叶子结点
for(charv='A';v<='Z';++v){
if(G[u][v]&&v!=fa){//邻接矩阵中有别的边
leaf=false;//u不是叶子结点
dfs(v,u,path);
}
}
if(leaf){//u为叶子结点,将路径加入到答案
List<Character>pt=newArrayList<Character>();
for(Characterc:path)pt.add(c);
ans.add(pt);
}
path.remove(path.size()-1);
}
publicvoidgo()throwsFileNotFoundException
{
Scannerin=newScanner(newFile("data.in"));
Strings;//进行输入的处理时的临时变量
n=in.nextInt();//获取结点个数
s=in.next();root=s.charAt(0);//获取根
for(inti=0;i<n-1;++i){
charu,v;
s=in.next();u=s.charAt(0);//获取边,并在邻接矩阵中做标记
s=in.next();v=s.charAt(0);
G[u][v]=G[v][u]=true;
}
List<Character>path=newArrayList<Character>();
dfs(root,'0',path);
for(inti=0;i<ans.size();++i){//输出答案
for(Characterc:ans.get(i))
System.out.print(c);
System.out.println();
}
in.close();
}
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
newMain().go();
}
}
java中jtree双击叶节点如何获取该文件所在的路径
一个读写XML文件的类
首先必须获得XML Parser的包,可以从下面的地址获得: http://xml.apache.org/xerces2-j/index.html。
然后设计一个XMLTree的类,继承自JTree类的定义和成员变量,函数定义如下:
public class XMLTree extends JTree{ private DefaultMutableTreeNode treeNode;//JTree的根节点 private DocumentBuilderFactory dbf;//这三个成员变量是xml parser需要的 private DocumentBuilder db; private Document doc; XMLTree(String fileName);//构造函数,做初始化工作 public DefaultMutableTreeNode LoadFile(Node root);//从某个XML文件生成该树 public void SaveToFile(DefaultMutableTreeNode root,FileWriter fw);//将该树存盘成XML文件 private Node parseXml( String text)}
其中构造函数所做的初始化工作如下:
XMLTree(String fileName){ dbf= DocumentBuilderFactory.newInstance();//生成dbf的实例 db= dbf.newDocumentBuilder();//生成db的实例 treeNode= LoadFile( getXMLRoot( text));//解析该xml文件,返回JTree的根节点 setModel( new DefaultTreeModel( treeNode));//根据该根节点生成JTree}
其中,parseXml是一个返回XML文件根元素的程序,如下:
private Node getXMLRoot( String text){ ByteArrayInputStream byteStream; byteStream= new ByteArrayInputStream( text.getBytes());//将XML文件读到Stream里去 try{ doc= db.parse( byteStream);//解析该xml文件。} catch( Exception e){ e.printStackTrace();} return( Node)doc.getDocumentElement();//返回该XML文件的DOM树的根元素}
核心部分的LoadFile是一个递归过程,如下:
private DefaultMutableTreeNode createTreeNode( Node root){ DefaultMutableTreeNode treeNode= null;//定义要返回的根节点 String name= root.getNodeName();//获得该节点的NodeName String value= root.getNodeValue();//获得该节点的NodeValue treeNode= new DefaultMutableTreeNode( root. getNodeType()== Node.TEXT_NODE? value: name);//如果为值节点,那么取得该节点的值,否则取得该节点的Tag的名字 if( root.hasChildNodes())//如果该节点有孩子节点,那么递归处理该节点的孩子节点{ NodeList children= root.getChildNodes();//取得该节点的子节点列表 if( children!= null){//判断子节点是否为空 int numChildren= children.getLength();//取得字节数目 for(int i=0; i< numChildren; i++){ Node node= children.item(i);//循环处理每个子节点 if( node!= null){ if( node.getNodeType()== Node.ELEMENT_NODE){ treeNode.add( createTreeNode(node));//如果该子节点还有孩子节点使用递归的方法处理该子节点} else{ String data= node.getNodeValue(); if( data!= null){ data= data.trim(); if(!data.equals(“\n”)&&!data.equals(“\r\n”)&& data.length()> 0){ treeNode.add(new DefaultMutableTreeNode(node.getNodeValue()));//如果该节点没有孩子节点,那么直接加到节点下}}}}}}} return treeNode;//返回节点}
使用Java的Swing包里的方法能够很容易地在JTree上做改动,可以使用弹出对话框的方法,也可以直接在JTree上改动。总之,JTree改动后,需要重新写回文件中去将一棵JTree写成XML文件是一个递归的过程,方法如下:
public void SaveToFile(DefaultMutableTreeNode, FileWriter fw){try{ if(root.isLeaf()) fw.write(root.toString()+“\r\n”);//如果是叶子节点则直接将该节点输出到文件中else{//不是叶子节点的话递归输出该节点 fw.write(“<”+root.toString()+“>\r\n”); for(int i=0; i< root.getChildCount(); i++){ DefaultMutableTreeNode childNode=(DefaultMutableTreeNode) root.getChildAt(i); saveFile(childNode, fw);//递归输出该节点的所有子节点} fw.write(“</”+root.toString()+“>\r\n”);}} catch(Exception e){ e.printStackTrace();}}
必须注意的是,如果XML文件中包含中文,那么需要在调用上面的函数之前,先在文件中输入该XML文件的编码方式,方法如下:
fw.write(“<?xml version=“1.0” encoding=“GB2312”?>\r\n”);
在调用该函数结束后,还应该关闭该文件,方法是:
fw.close()
OK,关于java叶节点是什么和java中jtree双击叶节点如何获取该文件所在的路径的内容到此结束了,希望对大家有所帮助。