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)进行删除,运行之后达到想要的效果。
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)进行删除,运行之后达到想要的效果。
相关文章推荐
- SpringMVC中 Redirect后地址栏带参数, 怎么把它去掉.
- java紧耦合与松耦合关系
- 轻量级分布式 RPC 框架 netty+protostuff+zk +Spring
- Spring Boot导出jar包发布
- 【Java并发编程实战】—–“J.U.C”:ReentrantReadWriteLock
- Java抽象类和抽象方法概述
- 我为何坚守Java?
- 关于struts 2中的日期问题
- 在java中实现输入两个正整数m和n,求最大的公约数和最小公倍数
- 看了以后对Spring中IOC和DI有一种醍醐灌顶的感觉(转载)
- Java 中的目录创建处理
- Java 判断文件夹、文件是否存在、否则创建文件夹
- Java容器填充-1
- 《Spring JDBC详解》
- java ArrayList无限添加元素
- java 什么是组件
- Spring MVC框架搭建
- 利用Zabbix低级发现结合jstat命令自动监控Java进程
- [Java]读取文件方法大全
- java中输入一行字符,分别统计英文字母、空格、数字的个数