简单的右键菜单编剧树形节点

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

 

 


public class Treetest extends JFrame {

 private JTree tree;
 DefaultTreeModel treeModel;
 public static void main(String[] args) {
     Treetest t = new Treetest();
        t.splitPane();
        t.jpopup();
 }
 
 /*利用树模型创建树形结构*/
 
    public void splitPane(){
     
     setTitle("树形结构");
     setSize(300,300);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     JSplitPane jpane = new JSplitPane();                     //创建分割面板
      JScrollPane scroll  = new JScrollPane();                 //创建滚动面板
      jpane.setDividerLocation(100);                           //设置分隔板与左边距100像素
     jpane.setOneTouchExpandable(true);                       // 设置设置水平分割面板的分隔条显示UI小部件
     
     /*添加各个节点*/
     
     DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("常用布局");
     DefaultMutableTreeNode  chlid1 = new DefaultMutableTreeNode ("流式布局");
     DefaultMutableTreeNode  chlid2 = new DefaultMutableTreeNode ("边界布局");
     DefaultMutableTreeNode  chlid3 = new DefaultMutableTreeNode ("网格布局");
     DefaultMutableTreeNode  chlid11 = new DefaultMutableTreeNode ("A");
     DefaultMutableTreeNode  chlid12 = new DefaultMutableTreeNode ("B");
     DefaultMutableTreeNode  chlid13 = new DefaultMutableTreeNode ("C");
     DefaultMutableTreeNode  chlid21 = new DefaultMutableTreeNode ("Z");
     DefaultMutableTreeNode  chlid22 = new DefaultMutableTreeNode ("d");
     DefaultMutableTreeNode  chlid31 = new DefaultMutableTreeNode ("f");
     DefaultMutableTreeNode  chlid32 = new DefaultMutableTreeNode ("dd");
     rootNode.add(chlid1);
     rootNode.add(chlid2);
     rootNode.add(chlid3);
     chlid1.add(chlid11);
     chlid1.add(chlid12);
     chlid1.add(chlid13);
     chlid2.add(chlid21);
     chlid2.add(chlid22);
     chlid3.add(chlid31);
     chlid3.add(chlid32);
     treeModel = new DefaultTreeModel(rootNode,true);
     tree = new JTree(treeModel);
     tree.setEditable(true); //设置树形可编辑
     tree.setFont(new Font("宋体",Font.BOLD,14));
        scroll.setViewportView(tree);
     jpane.setLeftComponent(scroll);
     getContentPane().add(jpane);
     
  
     setVisible(true);
    }
   
    /*创建右键菜单,实现对树形结构的添加,删除,修改*/
   
    public void jpopup(){
     //super();
     final JPopupMenu  jpopMenu = new JPopupMenu();
     JMenuItem mi_new = new JMenuItem("添加节点");
     /* 为添加节点添加动作监听器*/
     mi_new.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
       DefaultMutableTreeNode node = new DefaultMutableTreeNode("new Node"); // 创建欲添加节点
       TreePath selectionPath = tree.getSelectionPath();       // 创建欲添加节点
       DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode)selectionPath.getLastPathComponent();  // 获得选中的父节点
       treeModel.insertNodeInto(node, parentNode, parentNode.getChildCount());  // 插入节点到所有子节点之后
       TreePath path = selectionPath.pathByAddingChild(node);  // 获得新添加节点的路径
       if(!tree.isVisible(path)){
        tree.makeVisible(path);              // 如果该节点不可见则令其可见
       }
      }
     });
     /* 为修改节点添加动作监听器*/
        JMenuItem mi_edit = new JMenuItem("修改结点");
     mi_edit.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent e) {

    TreePath   path   =   tree.getSelectionPath();   //获取选中节点路径
    if   (path   !=   null)   
    tree.startEditingAtPath(path);    //选中节点呈现编辑

   }
      
     });
     /* 为删除节点添加动作监听器*/
     JMenuItem mi_delete = new JMenuItem("删除节点");
     mi_delete.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent e) {
   DefaultMutableTreeNode node =(DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); // 获得选中的欲删除节点
   if(!node.isRoot()){    // 查看欲删除的节点是否为根节点,根节点不允许删除
    DefaultMutableTreeNode nextSelectedNode = node.getNextSibling();  // 获得下一个兄弟节点,以备选中
    if(nextSelectedNode == null)  // 查看是否存在兄弟节点
     nextSelectedNode =(DefaultMutableTreeNode) node.getParent();  // 如果不存在则选中其父节点
     treeModel.removeNodeFromParent(node);  // 删除节点
     tree.setSelectionPath(new TreePath(nextSelectedNode.getPath()));   // 选中节点
    
   }
   }
      
     });
     jpopMenu.add(mi_new);
     jpopMenu.add(mi_edit);
     jpopMenu.addSeparator();
     jpopMenu.add(mi_delete);
     /*创建右键传出菜单*/
     tree.addMouseListener(new MouseAdapter(){
      public void mouseReleased(final MouseEvent e){
       if(e.isPopupTrigger()){
        jpopMenu.show(e.getComponent(),e.getX(),e.getY());
       }
      }
     });
     
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值