您的位置:首页 > 编程语言 > Java开发

Java中如何删除用hashtable创建的树节点

2015-10-31 13:05 330 查看
.......................

public class NewMyFrame extends JFrame {

...

....

...

.....

private JPopupMenu popup = null;
private JPopupMenu popup1 = null;
JTree tree = null;
DefaultTreeModel treeModel =null;
JTree tree = new JTree(TreeNodeHashTable.getTreeNode());

DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
tree.addMouseListener(new MouseListener() {

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
TreePath path = tree.getPathForLocation(e.getX(), e.getY());
if(path!=null){
if(e.getButton() == MouseEvent.BUTTON3){
String name[] = path.toString().split("\\,|\\[|\\]|\\ ");
/*for(int i=0;i<name.length;i++){
System.out.println(name[i]+"  "+i);
}*/
if(path.toString().split("\\,").length==2){
System.out.println( "选中父节点"+name[3]);
String dbname = name[3];
getPopupParentnode(dbname,path,tree).show(e.getComponent(), e.getX(), e.getY());
}else if(path.toString().split("\\,").length==3){
System.out.println( "选中子节点"+name[5]);
getPopupSubnode().show(e.getComponent(), e.getX(), e.getY());
}
}

}

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}
});

private JPopupMenu getPopupParentnode(String  DBname,TreePath path,JTree jTree){

popup = new JPopupMenu("Popup"); 
JMenuItem item1  = new JMenuItem("在本数据库下添加集合");  
           item1.addActionListener(new ActionListener() {  
               public void actionPerformed(ActionEvent e) {
                   //
               }  
           });  
        popup.add(item1);
        JMenuItem item2 = new JMenuItem("删除数据库");
        item2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//MongoDBSystem.mongo.dropDatabase(DBname);
JOptionPane.showMessageDialog(null, "删除"+DBname+"数据库成功");
if(path!=null){
DefaultMutableTreeNode selectionNode=(DefaultMutableTreeNode)path.getLastPathComponent();
//JOptionPane.showMessageDialog(null, selectionNode);
//下面两行是用于选取节点的父节点
//JOptionPane.showMessageDialog(null, selectionNode.getParent());
TreeNode parent=(TreeNode)selectionNode.getParent();

if(parent!=null){
//JOptionPane.showMessageDialog(null,treeModel);
DefaultTreeModel model=(DefaultTreeModel)jTree.getModel();

model.removeNodeFromParent(selectionNode);
//由DefaultTreeModel的removeNodeFromParent()方法删除节点,包括它的子节点
}
}

}
});
        popup.add(item2);
        popup.setVisible(true);
return popup; 
}

先看上面这段程序,我的tree是用hashtable从mongodb中抓取然后存入创建的。前两天遇到一个问题:发现在右键选取树节点,并删除的时候,发现在我的popup下的事件监听中,获取不到tree的model。试了几次,tree.getmodel()总为空。原本以为hashtable创建的jtree获取不到它本身的treemodel。事实并不如此。

在网上查了很多,查不到,今天才想到,虽然将tree定义成了static 类型的属性,在构造方法中也将tree赋值。但在private方法中的监听中,打印tree仍然为空,在删除节点的时候仍然会报NULLPointerException。解决来解决去,终于想出一个办法:将tree作为一个参数传值到private方法中。

再次打印。可以了,可以获取tree后,按照上面的方法获取model,并用removeNodeFromParent(selectionNode)进行删除,运行之后达到想要的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: