.......................
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)进行删除,运行之后达到想要的效果。