树节点监听节点改变Demo

/*
 * @(#)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) {
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值