本人是个菜鸟 最近遇到个难题 我想做一个树 要求 有右键菜单 可以新建立和删除 新建要求父节点下建立子节点 N层的 就是新建的子节点总是你选中节点的子节点 可以一直新建下去 N层 请各位大侠指导阿 最好有源代码 语言要JAVA 包用SWT的 谢谢啊 我得邮箱是[email protected] 收到满意答案 马上结帖 谢谢大家了

解决方案 »

  1.   

    SoB 
    你杂不叫氧化钙0428
      

  2.   

    仅供参考
    package rjc;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;
        String nodeName = null; //原有节点名称
        
        public TreeDemo5()
        {
    //        try {
    //         AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true");
    //         AlloyTheme theme = new BedouinTheme();//设置界面的外观,手册中共有5种样式
    //         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){}
            }
        }
    }
      

  3.   

    看下API很简单的,DefaultTreeModel DefaultTreeNode.
      

  4.   

    汗!原来你要SWT的,我用SWing给做了,功能完全实现了,觉得好的话就给分吧
    /**
       @version 1.02 2008-01-06
       @author tanlingyun
    */import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;/**
       This program demonstrates tree editing.
    */
    public class TreeEditTest
    {  
       public static void main(String[] args)
       {  
          JFrame frame = new TreeEditFrame();
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setVisible(true);
       }
    }/**
       A frame with a tree and buttons to edit the tree.
    */
    class TreeEditFrame extends JFrame implements MouseListener
    {
       public TreeEditFrame()
       {  
          setTitle("TreeEditTest");
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);      // construct tree      TreeNode root = makeSampleTree();
          model = new DefaultTreeModel(root);
          tree = new JTree(model);
          tree.setEditable(true);
          tree.addMouseListener(this);      // add scroll pane with tree      JScrollPane scrollPane = new JScrollPane(tree);
          add(scrollPane, BorderLayout.CENTER);      makeButtons();
          pop = new JPopupMenu();
          JMenuItem addChild,deleteNode;
          addChild = new JMenuItem("添加");
          
          addChild.addActionListener(new
             ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)
                      tree.getLastSelectedPathComponent();               if (selectedNode == null) return;               DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
                   model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());               // now display new node
                   
                   TreeNode[] nodes = model.getPathToRoot(newNode);
                   TreePath path = new TreePath(nodes);
                   tree.scrollPathToVisible(path);
                }
             });
          
          deleteNode = new JMenuItem("删除");
          
           deleteNode.addActionListener(new
             ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   DefaultMutableTreeNode selectedNode
                      = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();               if (selectedNode != null && selectedNode.getParent() != null)
                      model.removeNodeFromParent(selectedNode);
                }
             });
          
          pop.add(addChild);
          pop.add(deleteNode);
       }   public TreeNode makeSampleTree()
       {  
          DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
          DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
          root.add(country);
          DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
          country.add(state);
          DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
          state.add(city);
          city = new DefaultMutableTreeNode("San Diego");
          state.add(city);
          state = new DefaultMutableTreeNode("Michigan");
          country.add(state);
          city = new DefaultMutableTreeNode("Ann Arbor");
          state.add(city);
          country = new DefaultMutableTreeNode("Germany");
          root.add(country);
          state = new DefaultMutableTreeNode("Schleswig-Holstein");
          country.add(state);
          city = new DefaultMutableTreeNode("Kiel");
          state.add(city);
          return root;
       }   /**
          Makes the buttons to add a sibling, add a child, and
          delete a node.
       */
       public void makeButtons()
       {
          JPanel panel = new JPanel();
          JButton addSiblingButton = new JButton("Add Sibling");
          addSiblingButton.addActionListener(new
             ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   DefaultMutableTreeNode selectedNode
                      = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();               if (selectedNode == null) return;               DefaultMutableTreeNode parent
                      = (DefaultMutableTreeNode) selectedNode.getParent();               if (parent == null) return;               DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");               int selectedIndex = parent.getIndex(selectedNode);
                   model.insertNodeInto(newNode, parent, selectedIndex + 1);
             
                   // now display new node
                   
                   TreeNode[] nodes = model.getPathToRoot(newNode);
                   TreePath path = new TreePath(nodes);
                   tree.scrollPathToVisible(path);
                }
             });
          panel.add(addSiblingButton);      JButton addChildButton = new JButton("Add Child");
          addChildButton.addActionListener(new
             ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)
                      tree.getLastSelectedPathComponent();               if (selectedNode == null) return;               DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("New");
                   model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());               // now display new node
                   
                   TreeNode[] nodes = model.getPathToRoot(newNode);
                   TreePath path = new TreePath(nodes);
                   tree.scrollPathToVisible(path);
                }
             });
          panel.add(addChildButton);      JButton deleteButton = new JButton("Delete");
          deleteButton.addActionListener(new
             ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   DefaultMutableTreeNode selectedNode
                      = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();               if (selectedNode != null && selectedNode.getParent() != null)
                      model.removeNodeFromParent(selectedNode);
                }
             });
          panel.add(deleteButton);
          add(panel, BorderLayout.SOUTH);
       }
       
      public void mouseClicked(MouseEvent e) {
      }  public void mouseEntered(MouseEvent e) {
      }  public void mouseExited(MouseEvent e) {
      }  public void mousePressed(MouseEvent e) {
       if (e.getButton() == MouseEvent.BUTTON3) {
       
        pop.show(this, e.getX(), e.getY()+20);
       }
      }  public void mouseReleased(MouseEvent e) {
      }
       private JPopupMenu pop;
       private DefaultTreeModel model;
       private JTree tree;
       private static final int DEFAULT_WIDTH = 400;
       private static final int DEFAULT_HEIGHT = 200;
    }本文部分参考了《Java核心技术》卷2和mq612(五斗米)的blog,特此声明