java中jtree双击叶节点如何获取该文件所在的路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中jtree双击叶节点如何获取该文件所在的路径相关的知识,希望对你有一定的参考价值。

要解决的问题:1、双击事件中,怎么分辨是叶节点还是目录结点呢?2、双击叶结点后怎么获得该文件所在的路径?(因为我想用这个路径建一个新File)

一个读写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()
参考技术A // 我这里 sel 是选中的那个节点sel.isLeaf() 是叶子节点吗? 返回boolean型sel.isroot() 是根节点吗? 如果不是以上两种情况就是枝节点了 要得到路径可以 TreeNode[] a = sel.getPath(); //返回的是一个TreeNode型数组
String st = "";
for(int i=0;i<a.length;i++)
if(i!=a.length-1)
st += a[i] + "/"; //如果不是最后一个就连上一个“/ ”
else
st += a[i]; //最后一个即你选择的那个就不要加“/ ”



st 则为路径了,路径的格式你可以适当调整一下,草草一试,可能不尽如意,请见谅!
参考技术B 创建节点时,如new DefaultMutableTreeNode(file)

然后在点击时,就可以通过

(File) node.getUserObject();

这样,得到创建实例时设定的File对象,就可以得到全路径了

在java中如何响应单击JTree树中一个节点?

请诸位帮个忙!
我在java中建立了一个JTree的树,我想完成的功能就是,单击某一个节点后,响应对映的操作。

package myawt;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
public class MyF2 extends JFrame implements TreeSelectionListener
DefaultMutableTreeNode root = new DefaultMutableTreeNode("学校");
DefaultMutableTreeNode root1 = new DefaultMutableTreeNode("教学部");
DefaultMutableTreeNode root2 = new DefaultMutableTreeNode("行政部");
JTree tree1=new JTree(root);
public MyF2()
super("JTree");
this.setSize(800, 600);
root.add(root1);
root.add(root2);

this.add(tree1);
this.setVisible(true);



public static void main(String[] args)
new MyF2();


public void valueChanged(TreeSelectionEvent e)
我只知道要写这样一个方法,但是如何写我不会
例如,单击(或双击)“教学部”这个节点,就会输出“教学部”这几个字。




请大家帮帮忙~!谢谢!

我给你写了一个例子 你看看吧 你看了就明白了

package tree;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.beancontext.BeanContext;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

import com.sun.xml.internal.messaging.saaj.packaging.mime.util.BEncoderStream;

public class MainFrame extends JFrame

public static void main(String args[])
try
MainFrame frame = new MainFrame();
Dimension frameSize = frame.getSize();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if(frameSize.width>screenSize.width)
frameSize.width=screenSize.width;

if(frameSize.height>screenSize.height)
frameSize.height=screenSize.height;


frame.setLocation((screenSize.width-frameSize.width)/2, (screenSize.height-frameSize.height)/2);

frame.setVisible(true);
catch (Exception e)
e.printStackTrace();



private JTree tree;
private DefaultMutableTreeNode root = new DefaultMutableTreeNode("语言");
private DefaultMutableTreeNode menu_accp = new DefaultMutableTreeNode("英语");
private DefaultMutableTreeNode menu_benet = new DefaultMutableTreeNode("法语");
private DefaultMutableTreeNode menu_accp_s1 = new DefaultMutableTreeNode("4级");
private DefaultMutableTreeNode menu_accp_s2 = new DefaultMutableTreeNode("6级");
private DefaultMutableTreeNode menu_accp_y2 = new DefaultMutableTreeNode("8级");

private JTextField txtParent;
private JTextField txtNode;
private JTextField txtType;
private JTextField txtChild;
private JPopupMenu popupMenu;

/**
* Create the frame
*/
public MainFrame()
super();
getContentPane().setLayout(null);
setBounds(100, 100, 535, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(24, 10, 173, 317);
getContentPane().add(scrollPane);
tree = new JTree(root);
tree.addMouseListener(new MouseAdapter()
public void mouseClicked(MouseEvent e)
if(e.getModifiers()==Event.META_MASK)
addPopup(getContentPane(), popupMenu);
popupMenu.show(getContentPane(),e.getX()+30,e.getY()+40);


);
tree.addTreeSelectionListener(new TreeSelectionListener()
public void valueChanged(TreeSelectionEvent e)
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
Object nodeInfo = node.getUserObject();

if(node.isRoot())
txtParent.setText("");
txtNode.setText(nodeInfo.toString());
txtType.setText("根节点");
txtChild.setText(node.getChildCount() + "");
else
txtParent.setText(node.getParent().toString());
txtNode.setText(nodeInfo.toString());
if(node.isLeaf())
txtType.setText("叶节点");
else
txtType.setText("枝节点");

txtChild.setText(node.getChildCount() + "");



);
scrollPane.setViewportView(tree);

txtParent = new JTextField();
txtParent.setBounds(339, 49, 90, 21);
getContentPane().add(txtParent);

txtNode = new JTextField();
txtNode.setBounds(339, 107, 90, 21);
getContentPane().add(txtNode);

txtType = new JTextField();
txtType.setBounds(339, 167, 90, 21);
getContentPane().add(txtType);

txtChild = new JTextField();
txtChild.setBounds(339, 231, 90, 21);
getContentPane().add(txtChild);

final JLabel label = new JLabel();
label.setText("父类型节点");
label.setBounds(225, 49, 90, 15);
getContentPane().add(label);

final JLabel label_1 = new JLabel();
label_1.setText("节点的名称");
label_1.setBounds(225, 107, 90, 15);
getContentPane().add(label_1);

final JLabel label_2 = new JLabel();
label_2.setText("节点的类型");
label_2.setBounds(225, 167, 90, 15);
getContentPane().add(label_2);

final JLabel label_3 = new JLabel();
label_3.setText("子节点的个数");
label_3.setBounds(225, 231, 90, 15);
getContentPane().add(label_3);

popupMenu = new JPopupMenu();

final JMenuItem menuItem = new JMenuItem();
menuItem.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.removeNodeFromParent(node);

);
menuItem.setText("删除");
popupMenu.add(menuItem);
//


private static void addPopup(Component component, final JPopupMenu popup)
component.addMouseListener(new MouseAdapter()
public void mousePressed(MouseEvent e)
if (e.isPopupTrigger())
showMenu(e);

public void mouseReleased(MouseEvent e)
if (e.isPopupTrigger())
showMenu(e);

private void showMenu(MouseEvent e)
popup.show(e.getComponent(), e.getX(), e.getY());

);

参考技术A xxxTree.addTreeSelectionListener(new TreeSelectionListener() 

@Override
public void valueChanged(TreeSelectionEvent e) 

DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();
if (node.getUserObject() instanceof User) 
User selectUser= (User) node
.getUserObject();
selectUser(selectUser);// 选择后需要执行的代码


);

以上是关于java中jtree双击叶节点如何获取该文件所在的路径的主要内容,如果未能解决你的问题,请参考以下文章

Java程序,JTree获取节点ID

JAVA 得到jtree 某节点下的子节点

如何在jtree中搜索特定节点并使该节点展开。?

如何获取jtree中根节点的所有子节点?

Java:如何以编程方式选择和扩展 JTree 中的多个节点?

在java中如何响应单击JTree树中一个节点?