⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treedemo5.java

📁 详细介绍JTree两个常用的事件与处理,分别是TreeModeEvent与TreeSelectionEvent.
💻 JAVA
字号:
/**10-7:JTree的事件处理模式:
    在此节中,我们将详细介绍JTree两个常用的事件与处理,分别是TreeModeEvent与TreeSelectionEvent.
10-7-1:处理TreeModeEvent事件:
    当树的结构上有任何改变时,例如节点值改变了、新增节点、删除节点等,都会
TreeModelEvent事件,要处理这样的事件必须实作TreeModelListener接口,此界面定义了4个方法
如下所示:
TreeModelListener方法:
1、Void treeNodesChanged(TreeModelEvent e):当节点改变时系统就会云调用这个方法。
2、Void treeNodesInserted(TreeModelEvent e):当新增节时系统就会去调用这个方法。
3、Void treeNodesRemoved(TreeModeEvent e):当删除节点时系统就会去调用这个方法。
4、Void treeStructureChanged(TreeModelEvent e):当树结构改变时系统就会去调用这个方法。

TreeModelEvent类本身提供了5个方法,帮我们取得事件的信息,如下所示:

TreeModelEvent方法:
1、int[] getChildIndices():返回子节点群的索引值。
2、Object[] getChildren():返回子节点群.
3、Object[] getPath():返回Tree中一条path上(从root nod到leaf node)的节点。
4、TreePath getTreePath():取得目前位置的Tree Path.
5、String toString():取得蝗字符串表示法.

    *由TreeModelEvent的getTreePath()方法就可以得到TreePath对象,此对象就能够让我们知道
用户目前正选哪一个节点,TreePath类最常用的方法为:
    publicObject getLastPathComponent():取得最深(内)层的节点。
    public int getPathCount():取得此path上共有几个节点.
    我们来看下面这个例子,用户可以在Tree上编辑节点,按下[Enter]键后就可以改变原有的值,并将改变的值显示在下面的
JLabel中:
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
//import com.incors.plaf.alloy.*;
//import com.incors.plaf.alloy.themes.bedouin.*;

public class TreeDemo5 implements TreeModelListener
{
JLabel label = null;
static String nodeName = null; //原有节点名称
public TreeDemo5(){
UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader());
JFrame f = new JFrame("TreeDemo");
Container contentPane = f.getContentPane();

DefaultMutableTreeNode root = new DefaultMutableTreeNode("资源管理器");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("文件夹");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的电脑");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("收藏夹");
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Readme");
root.add(node1);
root.add(node2);
root.add(node3);
root.add(node4);

DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("公司文件");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("个人信件");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("私人文件");
node1.add(leafnode);

leafnode = new DefaultMutableTreeNode("本机磁盘(C:)");
node2.add(leafnode);
leafnode = new DefaultMutableTreeNode("本机磁盘(D:)");
node2.add(leafnode);
leafnode = new DefaultMutableTreeNode("本机磁盘(E:)");
node2.add(leafnode);

DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("网站列表");
node3.add(node31);

leafnode = new DefaultMutableTreeNode("天勤网站");
node31.add(leafnode);
leafnode = new DefaultMutableTreeNode("足球消息");
node31.add(leafnode);
leafnode = new DefaultMutableTreeNode("网络书店");
node31.add(leafnode);

//************************************************************************
JTree tree = new JTree(root);
tree.setEditable(true);//设置JTree为可编辑的
tree.addMouseListener(new MouseHandle());//使Tree加入检测Mouse事件,以便取得节点名称 
//下面两行取得DefaultTreeModel,并检测是否有TreeModelEvent事件.
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();

treeModel.addTreeModelListener(this);
//************************************************************************

JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(tree);

label = new JLabel("更改数据为: ");
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 treeNodesChanged(TreeModelEvent e) {	
  System.out.println("treeNodesChanged");
  TreePath treePath = e.getTreePath();
  System.out.println(treePath);
//下面这行由TreeModelEvent取得的是以DefaultMutableTreeNode为节点的父节点,而不是
//用户点选的节点,这点读者要特别注意。要取得真正的节点需要再加写下面6行代码.
DefaultMutableTreeNode node = (DefaultMutableTreeNode)treePath.getLastPathComponent();
  try {
//getChildIndices()方法会返回目前修改节点的索引值。由于我们只修改一个节点,因此节点索引值就放在index[0]
//的位置,若点选的节点为root node,则getChildIndices()的返回值为null,程序下面的第二行就在处理点选root
//node产生的NullPointerException问题.
     int[] index = e.getChildIndices();     
     System.out.println(index.length);

//由DefaultMutableTreeNode类的getChildAt()方法取得欲修改的节点对象.
     node = (DefaultMutableTreeNode)node.getChildAt(index[0]);
  } catch (NullPointerException exc) {}
//由DefaultMutableTreeNode类getUserObject()方法取得节点的内容,或是写成node.toString()亦相同.
  label.setText(nodeName+"更改数据为: "+(String)node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
  System.out.println("treeNodesRemoved!");
}
public void treeStructureChanged(TreeModelEvent e) {
}

public static void main(String args[]) {
  new TreeDemo5();
  System.out.println("haha!");
  //new TreeDemo5();
}

}

//处理Mouse点选事件
class MouseHandle extends MouseAdapter
{
public void mousePressed(MouseEvent e) 
{
try{
JTree tree = (JTree)e.getSource();
//JTree的getRowForLocation()方法会返回节点的列索引值。例如本例中,“本机磁盘(D:)”的列索引值为4,此索引值
//会随着其他数据夹的打开或收起而变支,但“资源管理器”的列索引值恒为0. 
int rowLocation = tree.getRowForLocation(e.getX(), e.getY());
//System.out.println("rowLocation为:"+rowLocation);
//JTree的getPathForRow()方法会取得从root node到点选节点的一条path,此path为一条直线,如程序运行的图示
//若你点选“本机磁盘(E:)”,则Tree Path为"资源管理器"-->"我的电脑"-->"本机磁盘(E:)",因此利用TreePath
//的getLastPathComponent()方法就可以取得所点选的节点.


TreePath treepath = tree.getPathForRow(rowLocation);
System.out.println("treepath为:"+tree.getSelectionPath());
TreeNode treenode = (TreeNode) treepath.getLastPathComponent(); 
TreeDemo5.nodeName = treenode.toString();
//System.out.println(treenode.toString());
}catch(NullPointerException ne){}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -