原来这里还有这么多变化!!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)
//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,我把代码发过来!
多谢了!急啊!
用Model的
insertNodeInto方法
或
removeNodeFromParent方法
Thanks a lot!
我用的是JBuilder3.0.
这个问题该不是大家都没有遇到吧?
faint!
model.reLoad();
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;
}
}
}
}
谢谢!
你是只加了一句jTreeUser.updateUI()吗?
真是四两拨千金啊!
哎,这么个问题,我搞了n长时间都没搞定,好羡慕你的功力啊!
我把分数给你加上了!
再次表示感谢!
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)