/*
* @(#)NewClass.java 2016-08-04
*
* Copyright 2010 Fiberhome. All rights reserved.
*/
package treetest;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
public class TreeDemo5 implements TreeModelListener {
JLabel label = null;
String nodeName = null; //原有節點名稱
public TreeDemo5() {
// try {
//
// // AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true");
// // AlloyTheme theme = new BedouinTheme();//設置界面的外觀,手冊中
//
// // LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);
// // UIManager.setLookAndFeel(alloyLnF);
// } catch (UnsupportedLookAndFeelException ex) {
// // You may handle the exception here
// }
// // this line needs to be implemented in order to make JWS work
//properly
// 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);
}
});
}
/*本方法實作TreeModelListener介面,本介面共定義四個方法,分別TreeNodesChanged()
*treeNodesInserted()、treeNodesRemoved()、treeNodesRemoved()、
*treeStructureChanged().在此範例中我們只針對更改節點值的部份,因此
只實作
*treeNodesChanged()方法.
*/
public void treeNodesChanged(TreeModelEvent e) {
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();
//由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) {
}
public void treeStructureChanged(TreeModelEvent e) {
}
public static void main(String args[]) {
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());
/*JTree的getPathForRow()方法會取得從root node到點選節點的一
條path,此path為一條直線,如程式運行的圖示
*若你點選“本機磁盤(E:)”,則Tree Path為"資源管理器"-->"我的
電腦"-->"本機磁盤(E:)",因此利用TreePath
*的getLastPathComponent()方法就可以取得所點選的節點.
*/
TreePath treepath = tree.getPathForRow(rowLocation);
TreeNode treenode = (TreeNode) treepath.getLastPathComponent();
nodeName = treenode.toString();
} catch (NullPointerException ne) {
}
}
}
}
树节点监听节点改变Demo
最新推荐文章于 2022-04-16 11:33:24 发布