高手都到哪里去了?
我想只要用 Java开发的人都会遇到这个问题的?
怎么会没人回答???!!!

解决方案 »

  1.   

    使用JTree默认的构造方法建立的JTree,上面的那段程序确实没有错,但是我自己建了一棵树:
        
       //Construct the User Tree root Node.
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("权限管理");
        jTreeUser = new JTree(root);
        nodeGroup = new DefaultMutableTreeNode("用户组");
        root.add(nodeGroup);
        nodeRole = new DefaultMutableTreeNode("角色");
        root.add(nodeRole);     getAllGroupAndRole();  //一个函数,用来取用户组,用户和角色
        for(int i = 0;i < UserGroup.size();i++) {
            //添加用户组
            //Leaf是自己写的一个类
            Leaf leafGroup = (Leaf)UserGroup.get(i);
            DefaultMutableTreeNode childGroup = new DefaultMutableTreeNode  (leafGroup);
            nodeGroup.add(childGroup);
            //添加每个用户组下的用户
            for (int j =0;j<UserInGroup[i].length;j++){
              Leaf leafUser = (Leaf)UserInGroup[i][j];
              DefaultMutableTreeNode grandChild = new DefaultMutableTreeNode(leafUser);
              childGroup.add(grandChild);
            }
            //添加角色
            Leaf leafRole = (Leaf)Roles.get(i);
            DefaultMutableTreeNode childRole = new DefaultMutableTreeNode(leafRole);
            nodeRole.add(childRole);
        }按照这个方法建立的JTree,就会出现问题!如果那位高手感兴趣,告诉我E-mail,我把代码发过来!
    多谢了!急啊!
      

  2.   

    这不是推荐的用法
    用Model的
    insertNodeInto方法

    removeNodeFromParent方法
      

  3.   

    可是JTree.java中,JTree.getDefaultTreeModel中用的就是我上面的方法.另外,我删除节点时,用的就是你说的removeNodeFromParent方法.
      

  4.   

    wolfsquare,我把代码给你发过去了!
    Thanks a lot!
    我用的是JBuilder3.0.
      

  5.   

    在删除了节点后,我用了validate方法仍然没有效果!
      

  6.   

    不会吧?怎么又没有消息了?
    这个问题该不是大家都没有遇到吧?
    faint!
      

  7.   

    你可以用这种方法试一试:
    model.reLoad();
      

  8.   

    这是我修改过后的代码:
    package UserManage;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    import java.util.*;public class UserManageFrame extends JFrame
           implements ActionListener,MenuListener{
      private JPopupMenu popup;
      private MouseAdapter msAdapter;
      private JTree jTreeUser;
      private JTree jTreeTest;
      private static DefaultTreeModel model;
      private TreeSelectionModel selectionModel;
      private DefaultMutableTreeNode nodeChoosed; //记录当前被选中的节点的信息
      private DefaultMutableTreeNode nodeGroup;
      private DefaultMutableTreeNode nodeRole;
      private Vector UserGroup;                   //记录所有用户组的信息
      private Object[][] UserInGroup;             //记录用户组中所有用户
      private Vector Roles;                       //记录所有角色的信息
      private JMenuItem addGroup;
      private JMenuItem delGroup;
      private JMenuItem modifyGroup;
      private JMenuItem addUser;
      private JMenuItem delUser;
      private JMenuItem modifyUser;
      private JMenuItem addRole;
      private JMenuItem delRole;
      private JMenuItem modifyRole;
      private JMenuItem setRights;
      public UserManageFrame() {    setTitle("权限管理系统");
        setSize(400,300);
        addWindowListener(new WindowAdapter(){
          public void windowClosing(WindowEvent e){
            System.exit(0);
          }
        });
        //Construct the User Tree root Node.
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("权限管理");
        jTreeUser = new JTree(root);
        nodeGroup = new DefaultMutableTreeNode("用户组");
        root.add(nodeGroup);
        nodeRole = new DefaultMutableTreeNode("角色");
        root.add(nodeRole);
        jTreeUser = new JTree(root);
        model = (DefaultTreeModel)jTreeUser.getModel();
        selectionModel = jTreeUser.getSelectionModel();
        selectionModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        getAllGroupAndRole();
        for(int i = 0;i < UserGroup.size();i++) {
            //添加用户组
            Leaf leafGroup = (Leaf)UserGroup.get(i);
            DefaultMutableTreeNode childGroup = new DefaultMutableTreeNode(leafGroup);
            nodeGroup.add(childGroup);
            //添加每个用户组下的用户
            for (int j =0;j<UserInGroup[i].length;j++){
              Leaf leafUser = (Leaf)UserInGroup[i][j];
              DefaultMutableTreeNode grandChild = new DefaultMutableTreeNode(leafUser);
              childGroup.add(grandChild);
            }
            //添加角色
            Leaf leafRole = (Leaf)Roles.get(i);
            DefaultMutableTreeNode childRole = new DefaultMutableTreeNode(leafRole);
            nodeRole.add(childRole);
        }    //Initialize the Popup Menu
        //按照这种方法建立的菜单不能设定禁用
        //popup = makePopupMenu(new Object[]{"添加新用户组","删除选中用户组","修改用户组属性",
        //                                   "添加新用户","删除用户","修改用户属性",
        //                                   "添加角色","删除角色","修改角色属性" ,
        //                                   null,"设置权限"},this);    popup = new JPopupMenu();
        addGroup = new JMenuItem("添加新用户组");
        delGroup = new JMenuItem("删除选中用户组");
        modifyGroup = new JMenuItem("修改用户组属性");
        addUser = new JMenuItem("添加新用户");
        delUser = new JMenuItem("删除用户");
        modifyUser = new JMenuItem("修改用户属性");
        addRole = new JMenuItem("添加角色");
        delRole = new JMenuItem("删除角色");
        modifyRole = new JMenuItem("修改角色属性");
        setRights = new JMenuItem("设置权限");    addGroup.addActionListener(this);
        delGroup.addActionListener(this);
        modifyGroup.addActionListener(this);
        addUser.addActionListener(this);
        delUser.addActionListener(this);
        modifyUser.addActionListener(this);
        addRole.addActionListener(this);
        delRole.addActionListener(this);
        modifyRole.addActionListener(this);
        setRights.addActionListener(this);    popup.add(addGroup);
        popup.add(delGroup);
        popup.add(modifyGroup);
        popup.add(addUser);
        popup.add(delUser);
        popup.add(modifyUser);
        popup.add(addRole);
        popup.add(delRole);
        popup.add(modifyRole);
        popup.addSeparator();
        popup.add(setRights);    //Set the Interface components.
        JSplitPane jSplitPane = new JSplitPane();
        JPanel jPanelLeft = new JPanel();
        JPanel jPanelRight = new JPanel();
        JScrollPane jScrollPaneLeft = new JScrollPane();
        JScrollPane jScrollPaneRight = new JScrollPane();    Container contentPane = getContentPane();
        GridBagLayout gbl1 = new GridBagLayout();
        contentPane.setLayout(gbl1);
        contentPane.add(jSplitPane,new GridBagConstraints(0,0,1,1,1.0,1.0,
                        GridBagConstraints.CENTER,GridBagConstraints.BOTH,
                        new Insets(10,10,10,10),70,-50));
        jSplitPane.add(jPanelLeft,jSplitPane.LEFT);
        jSplitPane.add(jPanelRight,jSplitPane.RIGHT);    jPanelLeft.setLayout(new BorderLayout());
        jPanelLeft.add(jScrollPaneLeft,BorderLayout.CENTER);    jPanelRight.setLayout(new BorderLayout());
        jPanelRight.add(jScrollPaneRight,BorderLayout.CENTER);    jScrollPaneLeft.getViewport().add(jTreeUser, null);    jScrollPaneRight.getViewport().add(jTreeTest,null);    //Pop up the Popup Menu
        jTreeUser.addMouseListener(new MouseAdapter(){
          public void mousePressed(MouseEvent evt){      }
          public void mouseReleased(MouseEvent evt){
              if(nodeChoosed==null)return;
              if (!nodeChoosed.isRoot()){
                if (evt.isPopupTrigger()){
                   if (nodeChoosed==nodeGroup){
                     addGroup.setEnabled(true);
                     delGroup.setEnabled(false);
                     modifyGroup.setEnabled(false);
                     addUser.setEnabled(false);
                     delUser.setEnabled(false);
                     modifyUser.setEnabled(false);
                     addRole.setEnabled(false);
                     delRole.setEnabled(false);
                     modifyRole.setEnabled(false);
                     setRights.setEnabled(false);
                   }
                   else if (nodeChoosed==nodeRole){
                     addGroup.setEnabled(false);
                     delGroup.setEnabled(false);
                     modifyGroup.setEnabled(false);
                     addUser.setEnabled(false);
                     delUser.setEnabled(false);
                     modifyUser.setEnabled(false);
                     addRole.setEnabled(true);
                     delRole.setEnabled(false);
                     modifyRole.setEnabled(false);
                     setRights.setEnabled(false);
                   }
                   else if (nodeChoosed.getParent()==nodeGroup){
                     addGroup.setEnabled(false);
                     delGroup.setEnabled(true);
                     modifyGroup.setEnabled(true);
                     addUser.setEnabled(true);
                     delUser.setEnabled(false);
                     modifyUser.setEnabled(true);
                     addRole.setEnabled(false);
                     delRole.setEnabled(false);
                     modifyRole.setEnabled(false);
                     setRights.setEnabled(true);
                   }
                   else if (nodeChoosed.getParent().getParent()==nodeGroup){
                     addGroup.setEnabled(false);
                     delGroup.setEnabled(false);
                     modifyGroup.setEnabled(false);
                     addUser.setEnabled(false);
                     delUser.setEnabled(true);
                     modifyUser.setEnabled(true);
                     addRole.setEnabled(false);
                     delRole.setEnabled(false);
                     modifyRole.setEnabled(false);
                     setRights.setEnabled(true);
                   }
                   else if (nodeChoosed.getParent()==nodeRole){
                     addGroup.setEnabled(false);
                     delGroup.setEnabled(false);
                     modifyGroup.setEnabled(false);
                     addUser.setEnabled(false);
                     delUser.setEnabled(false);
                     modifyUser.setEnabled(false);
                     addRole.setEnabled(false);
                     delRole.setEnabled(true);
                     modifyRole.setEnabled(true);
                     setRights.setEnabled(true);
                   }
                  popup.show(evt.getComponent(),evt.getX(),evt.getY());
                }
              }
          }
        });    //TreeSelectionListener
        jTreeUser.addTreeSelectionListener(new TreeSelectionListener(){
          public void valueChanged(TreeSelectionEvent e){
            TreePath path = e.getNewLeadSelectionPath();
            if(path==null)return;
            nodeChoosed = (DefaultMutableTreeNode)path.getLastPathComponent();
            if(nodeChoosed==null)return;
            Leaf leaf = (Leaf)nodeChoosed.getUserObject();
            if(leaf==null)return;
            if(!(leaf instanceof Leaf))return; 
            String [] str = {leaf.groupOrRoleID,leaf.groupOrRoleName};
            JOptionPane.showMessageDialog(UserManageFrame.this,str[0]+"--"+str[1],
                                          "TreeSelected",JOptionPane.INFORMATION_MESSAGE);
           }
        });   model.addTreeModelListener(new TreeModelListener() {
    public void treeNodesInserted(TreeModelEvent e) {
    showInsertionOrRemoval(e, " added to ");
    }
    public void treeNodesRemoved(TreeModelEvent e) {
    showInsertionOrRemoval(e, " removed from ");
    }
    private void showInsertionOrRemoval(TreeModelEvent e,
    String s) {
    Object[] parentPath = e.getPath();
    int[] indexes = e.getChildIndices();
    Object[] children = e.getChildren();
    Object parent = parentPath[parentPath.length-1]; JOptionPane.showMessageDialog(UserManageFrame.this,
       "Node \"" + children[0].toString() +
       "\"" + s + parent.toString() +
       " at index " + indexes[0],
       "Node Added or Removed",
       JOptionPane.INFORMATION_MESSAGE);
    }
    public void treeNodesChanged(TreeModelEvent e) {}
    public void treeStructureChanged(TreeModelEvent e) {}
    });
      }  //Function to make Popup menu
      public static JPopupMenu makePopupMenu(Object[] items,Object target){
        JPopupMenu m= new JPopupMenu();
        for (int i=0;i<items.length;i++){
          if (items[i]==null)
            m.addSeparator();
          else
            m.add(makeMenuItem(items[i],target));
        }
        return m;
      }
      //Function to make menuItems
      public static JMenuItem makeMenuItem(Object item,Object target){
        JMenuItem r = null;
        if (item instanceof String)
          r = new JMenuItem((String)item);
        else if (item instanceof JMenuItem)
          r = (JMenuItem)item;
        else
          return null;
        if (target instanceof ActionListener)
          r.addActionListener((ActionListener)target);
        return r;
      }
      //Function actionPerformed
      public void actionPerformed(ActionEvent evt){
        if (evt.getSource() instanceof JMenuItem){
          String arg = evt.getActionCommand();
          if (arg.equals("添加新用户组")){
            JOptionPane.showMessageDialog(UserManageFrame.this,
            "Add new Group","Add",JOptionPane.INFORMATION_MESSAGE);
            String sgroupID = JOptionPane.showInputDialog(UserManageFrame.this,"请输入用户组id号",
            "New Group Node",JOptionPane.QUESTION_MESSAGE);
            String sgroupName = JOptionPane.showInputDialog(UserManageFrame.this,"请输入用户组名称",
            "New Group Node",JOptionPane.QUESTION_MESSAGE);
            Leaf leaf = new Leaf(sgroupID,sgroupName);
            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(leaf);
            int index = nodeChoosed.getIndex(nodeChoosed)+1;
            model.insertNodeInto(newNode,nodeChoosed,index);
          }
          else if (arg.equals("删除选中用户组")){
            JOptionPane.showMessageDialog(UserManageFrame.this,
            "Delete Selected Group","Del",JOptionPane.INFORMATION_MESSAGE);
            TreePath path = selectionModel.getSelectionPath();
            DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
            //model.removeNodeFromParent(node);
            node.removeFromParent();
            jTreeUser.updateUI();
          }
          else if (arg.equals("修改用户组属性")){      }
          else if (arg.equals("添加新用户")){
            JOptionPane.showMessageDialog(UserManageFrame.this,
                                          "Add new User","Add User",JOptionPane.INFORMATION_MESSAGE);
            String sgroupID = JOptionPane.showInputDialog(UserManageFrame.this,"请输入用户id号",
                                          "New User Node",JOptionPane.QUESTION_MESSAGE);
            String sgroupName = JOptionPane.showInputDialog(UserManageFrame.this,"请输入用户名称",
                                          "New User Node",JOptionPane.QUESTION_MESSAGE);
            Leaf leaf = new Leaf(sgroupID,sgroupName);
            MutableTreeNode newNode = new DefaultMutableTreeNode(leaf);
            int index = nodeChoosed.getIndex(nodeChoosed)+1;
            model.insertNodeInto(newNode,nodeChoosed,index);
          }
          else if (arg.equals("删除用户")){
            JOptionPane.showMessageDialog(UserManageFrame.this,
                                          "Delete Selected User","Del",JOptionPane.INFORMATION_MESSAGE);
            TreePath path = selectionModel.getSelectionPath();
            JOptionPane.showMessageDialog(UserManageFrame.this,
                                          path.toString(),"Del",JOptionPane.INFORMATION_MESSAGE);        MutableTreeNode node = (MutableTreeNode)path.getLastPathComponent();
            //model.removeNodeFromParent(node);
            node.removeFromParent();
            jTreeUser.updateUI();
          }
          else if (arg.equals("修改用户属性")){      }
          else if (arg.equals("添加角色")){      }
          else if (arg.equals("删除角色")){      }
          else if (arg.equals("修改角色属性")){      }
          else if (arg.equals("设置权限")){      }
        }
      }  public void menuSelected(MenuEvent evt){
        //JOptionPane.showMessageDialog(UserManageFrame.this,"OK","OK",JOptionPane.INFORMATION_MESSAGE);
        //if (nodeChoosed.getParent()==nodeGroup)
        //  addGroup.setEnabled(false);
      }
      public void menuDeselected(MenuEvent evt){  }
      public void menuCanceled(MenuEvent evt){  }  class Leaf {                      //记录所选用户组/角色的ID号和名称
        String groupOrRoleID;           //用户组/角色ID号
        String groupOrRoleName;         //用户组/角色名称
        public Leaf(String grID,String grName) {
          groupOrRoleID = grID;
          groupOrRoleName = grName;
        }
        public String toString() {
          return groupOrRoleName;
        }
      }  //获得所有用户组的信息,并将其存储在Vector--UserGroup和Roles中
      void getAllGroupAndRole() {
        int len = 10;
        UserGroup = new Vector(len,1);   //构建用户组空矢量
        Roles = new Vector(len,1);       //构建角色空矢量
        UserInGroup = new Object[len][]; //构建二维数组存放所有用户    for (int i =0;i<len;i++)
          UserInGroup[i] = new Object[i+1];    for(int i = 0;i < len;i ++ ){
          Leaf leafGroup = new Leaf("Group" + i,"用户组" + i);
          UserGroup.add(leafGroup);
          Leaf leafRole = new Leaf("Role"+ i,"角色"+ i);
          Roles.add(leafRole);
          for (int j = 0;j<UserInGroup[i].length;j++){
            Leaf leafUser = new Leaf("User"+i+j,"用户"+i+j);
            UserInGroup[i][j]=leafUser;
          }
        }
      }
    }
      

  9.   

    wolfsquare!!!
    谢谢!
    你是只加了一句jTreeUser.updateUI()吗?
    真是四两拨千金啊!
    哎,这么个问题,我搞了n长时间都没搞定,好羡慕你的功力啊!
    我把分数给你加上了!
    再次表示感谢!
      

  10.   

    原来这里还有这么多变化!!wolfsquare还有点问题!当我在TreeSelection 中的valueChanged方法中,使用了nodeChoosed.getUserObject(),当我点击展开树时,后台会出现异常!如果不用它,就没有,为什么呢?        TreePath path = e.getNewLeadSelectionPath();
            if(path==null)return;
            nodeChoosed = (DefaultMutableTreeNode)path.getLastPathComponent();
            if(nodeChoosed==null)return;
            Leaf leaf = (Leaf)nodeChoosed.getUserObject();
            if(leaf==null)return;
            if(!(leaf instanceof Leaf))return;
            String [] str = {leaf.groupOrRoleID,leaf.groupOrRoleName};
            JOptionPane.showMessageDialog(UserManageFrame.this,str[0]+"--"+str[1],
                                  "TreeSelected",JOptionPane.INFORMATION_MESSAGE);
    错误如下:
    Exception occurred during event dispatching:
    java.lang.ClassCastException: java.lang.String
    at UserManage.UserManageFrame$3.valueChanged(UserManageFrame.java:220)
    at javax.swing.JTree.fireValueChanged(JTree.java:2053)
    at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:2353)
    at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:583)
    at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:899)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:245)
    at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:140)
    at javax.swing.JTree.setSelectionPath(JTree.java:977)
    at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2006)
    at javax.swing.plaf.basic.BasicTreeUI$MouseHandler.mousePressed(BasicTreeUI.java:2549)
    at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:220)
    at java.awt.Component.processMouseEvent(Compiled Code)
    at java.awt.Component.processEvent(Compiled Code)
    at java.awt.Container.processEvent(Compiled Code)
    at java.awt.Component.dispatchEventImpl(Compiled Code)
    at java.awt.Container.dispatchEventImpl(Compiled Code)
    at java.awt.Component.dispatchEvent(Compiled Code)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Compiled Code)
    at java.awt.LightweightDispatcher.processMouseEvent(Compiled Code)
    at java.awt.LightweightDispatcher.dispatchEvent(Compiled Code)
    at java.awt.Container.dispatchEventImpl(Compiled Code)
    at java.awt.Window.dispatchEventImpl(Compiled Code)
    at java.awt.Component.dispatchEvent(Compiled Code)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:258)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:68)
      

  11.   

    这是你的节点的UserObject不是Leaf类,缺省是String.可能是因为组节点没有设置UserObject造成的.