1. package com.swing.demo;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Container;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.MouseAdapter;
  8. import java.awt.event.MouseEvent;
  9.  
  10. import javax.swing.CellEditor;
  11. import javax.swing.JButton;
  12. import javax.swing.JFrame;
  13. import javax.swing.JLabel;
  14. import javax.swing.JPanel;
  15. import javax.swing.JScrollPane;
  16. import javax.swing.JTree;
  17. import javax.swing.event.CellEditorListener;
  18. import javax.swing.event.ChangeEvent;
  19. import javax.swing.event.TreeModelEvent;
  20. import javax.swing.event.TreeModelListener;
  21. import javax.swing.tree.DefaultMutableTreeNode;
  22. import javax.swing.tree.DefaultTreeModel;
  23. import javax.swing.tree.TreeNode;
  24. import javax.swing.tree.TreePath;
  25.  
  26. /**
  27. * tree node 添加 , 删除, 修改
  28. *
  29. * @author Administrator
  30. *
  31. */
  32. public class JTreeTest implements ActionListener, TreeModelListener {
  33. private JLabel statusLabel = null;
  34. private JTree tree = null;
  35. private DefaultTreeModel treeModel = null;
  36. private String oldNodeName = null;
  37.  
  38. public JTreeTest() {
  39. JFrame frame = new JFrame("JTreeTest 窗体");
  40. Container contentPane = frame.getContentPane();
  41.  
  42. DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
  43. tree = new JTree(root);
  44. tree.addMouseListener(new MyTreeMouseListener());
  45. treeModel = (DefaultTreeModel) tree.getModel();
  46. treeModel.addTreeModelListener(this);
  47. tree.setEditable(true);
  48. tree.getCellEditor().addCellEditorListener(
  49. new MyTreeCellEditorListener());
  50. JScrollPane scrollPane = new JScrollPane();
  51. scrollPane.setViewportView(tree);
  52.  
  53. JPanel toolBarPanel = new JPanel();
  54. JButton b = new JButton("新增节点");
  55. b.addActionListener(this);
  56. toolBarPanel.add(b);
  57. b = new JButton("删除节点");
  58. b.addActionListener(this);
  59. toolBarPanel.add(b);
  60. b = new JButton("清除所有节点");
  61. b.addActionListener(this);
  62. toolBarPanel.add(b);
  63.  
  64. statusLabel = new JLabel("Action");
  65. contentPane.add(toolBarPanel, BorderLayout.NORTH);
  66. contentPane.add(scrollPane, BorderLayout.CENTER);
  67. contentPane.add(statusLabel, BorderLayout.SOUTH);
  68. frame.pack();
  69. frame.setVisible(true);
  70. frame.requestFocus();
  71. frame.setSize(400, 300);
  72. frame.setLocationRelativeTo(null);
  73. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  74. }
  75.  
  76. // 本方法运行新增、删除、清除所有节点的程序代码.
  77. public void actionPerformed(ActionEvent ae) {
  78. if (ae.getActionCommand().equals("新增节点")) {
  79. DefaultMutableTreeNode parentNode = null;
  80. DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
  81. newNode.setAllowsChildren(true);
  82. TreePath parentPath = tree.getSelectionPath();
  83. if (parentPath == null) {
  84. return;
  85. }
  86. // 取得新节点的父节点
  87. parentNode = (DefaultMutableTreeNode) (parentPath
  88. .getLastPathComponent());
  89.  
  90. // 由DefaultTreeModel的insertNodeInto()方法增加新节点
  91. treeModel.insertNodeInto(newNode, parentNode,
  92. parentNode.getChildCount());
  93.  
  94. // tree的scrollPathToVisible()方法在使Tree会自动展开文件夹以便显示所加入的新节点。若没加这行则加入的新节点
  95. // 会被 包在文件夹中,你必须自行展开文件夹才看得到。
  96. tree.scrollPathToVisible(new TreePath(newNode.getPath()));
  97. tree.setSelectionPath(new TreePath(newNode.getPath()));
  98. statusLabel.setText("新增节点成功");
  99. }
  100. if (ae.getActionCommand().equals("删除节点")) {
  101. TreePath treepath = tree.getSelectionPath();
  102. if (treepath != null) {
  103. // 下面两行取得选取节点的父节点.
  104. DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) treepath
  105. .getLastPathComponent();
  106. TreeNode parent = (TreeNode) selectionNode.getParent();
  107. if (parent != null) {
  108. // 由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。
  109. treeModel.removeNodeFromParent(selectionNode);
  110. statusLabel.setText("删除节点成功");
  111. }
  112. }
  113. }
  114. if (ae.getActionCommand().equals("清除所有节点")) {
  115.  
  116. // 下面一行,由DefaultTreeModel的getRoot()方法取得根节点.
  117. DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) treeModel
  118. .getRoot();
  119.  
  120. // 下面一行删除所有子节点.
  121. rootNode.removeAllChildren();
  122.  
  123. // 删除完后务必运行DefaultTreeModel的reload()操作,整个Tree的节点才会真正被删除.
  124. treeModel.reload();
  125. statusLabel.setText("清除所有节点成功");
  126. }
  127. }
  128.  
  129. public void treeNodesChanged(TreeModelEvent e) {
  130. TreePath treePath = e.getTreePath();
  131. DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath
  132. .getLastPathComponent();
  133. try {
  134. int[] index = e.getChildIndices();
  135. node = (DefaultMutableTreeNode) node.getChildAt(index[0]);
  136. } catch (NullPointerException exc) {
  137. }
  138. statusLabel.setText(oldNodeName + "更改数据为:"
  139. + (String) node.getUserObject());
  140. }
  141.  
  142. public static void main(String[] args) {
  143. new JTreeTest();
  144. }
  145.  
  146. class MyTreeMouseListener extends MouseAdapter {
  147. public void mousePressed(MouseEvent e) {
  148. try {
  149. JTree tree = (JTree) e.getSource();
  150. int rowLocation = tree.getRowForLocation(e.getX(), e.getY());
  151. TreePath treepath = tree.getPathForRow(rowLocation);
  152. TreeNode treenode = (TreeNode) treepath.getLastPathComponent();
  153. oldNodeName = treenode.toString();
  154. } catch (NullPointerException ne) {
  155. }
  156. }
  157. }
  158.  
  159. class MyTreeCellEditorListener implements CellEditorListener {
  160. public void editingStopped(ChangeEvent e) {
  161. Object selectnode = tree.getLastSelectedPathComponent();
  162. DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectnode;
  163. CellEditor cellEditor = (CellEditor) e.getSource();
  164. String newName = (String) cellEditor.getCellEditorValue();
  165. node.setUserObject(newName);
  166.  
  167. DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
  168. model.nodeStructureChanged(node);
  169. }
  170.  
  171. public void editingCanceled(ChangeEvent e) {
  172. editingStopped(e);
  173. }
  174. }
  175.  
  176. @Override
  177. public void treeNodesInserted(TreeModelEvent e) {
  178. }
  179.  
  180. @Override
  181. public void treeNodesRemoved(TreeModelEvent e) {
  182. }
  183.  
  184. @Override
  185. public void treeStructureChanged(TreeModelEvent e) {
  186. }
  187. }

JTree 添加 , 删除, 修改的更多相关文章

  1. SQL语句添加删除修改字段及一些表与字段的基本操作

    用SQL语句添加删除修改字段 1.增加字段     alter table docdsp    add dspcode char(200)2.删除字段     ALTER TABLE table_NA ...

  2. Entity framework 绑定到Datagridview的添加删除修改

    Entity framework 绑定到Datagridview的添加删除修改 using System; using System.Collections.Generic; using System ...

  3. JavaScript学习 - 基础(八) - DOM 节点 添加/删除/修改/属性值操作

    html代码: <!--添加/删除/修改 --> <div id="a1"> <button id="a2" onclick=&q ...

  4. 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等

    用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...

  5. SQL语句添加删除修改字段[sql server 2000/2005]

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  6. SQL语句添加删除修改字段

    用SQL语句添加删除修改字段1.增加字段     alter table docdsp    add dspcodechar(200)2.删除字段     ALTER TABLE table_NAME ...

  7. Dom4j 操作, 节点查找 添加 删除 修改 。。。xPath

    转: Dom4j 操作, 节点查找 添加 删除 修改 ...xPath 2013年11月28日 10:48:59 今晚打酱油8 阅读数:8506更多 个人分类: JavaWeb   版权声明:本文为博 ...

  8. dir(dict)|字典的创建-添加-删除-修改-判断存在-取值等相关操作

    dir(dict) ####字典操作:创建-添加-删除-修改-判断存在-取值 #(一)创建字典: {} .等号. zip(). [(),()] #1.创建空字典 dict0 = {} #2.等号创建 ...

  9. sqlserverdatasouce控件如何让添加删除修改自动化

    对于sqlserverdatasouce控件,添加插入修改和删除命令,可以自动删除修改更新数据,不需要编写一行代码,但是有时更新失败,原因在于选中了[开放式并发],这个选中,如果该表与其他的数据表关联 ...

随机推荐

  1. Oracle表字段类型更改的一个经验

    先前表中ID字段类型是用序列,由于安全问题,需要处理水平权限的漏洞,虽然使用加密也可以处理,为了更方便,需要将字段类型改为Guid,如果表中已经有数据,更改起来不是很方便,对于基础数据表,这里提供一个 ...

  2. Controller、Service、Dao进行Junit单元

    原文链接:http://blog.csdn.net/u013041642/article/details/71430293 Spring对Controller.Service.Dao进行Junit单元 ...

  3. TensorFlow最佳实践样例

    以下代码摘自<Tensor Flow:实战Google深度学习框架> 本套代码是在 http://www.cnblogs.com/shanlizi/p/9033330.html 基础上进行 ...

  4. 第一篇:打造专属开发工具Eclipse篇

    第一篇:打造专属开发工具Eclipse篇 eclipse 优化 1.动画很酷,但如果可以的话,我总是在所有的工具中禁用动画.所以classic或者window classic主题是我最常用的主题 , ...

  5. Kafka 0.8翻译官网精华.md

    1主要的设计元素 Kafka之所以和其它绝大多数信息系统不同,是因为下面这几个为数不多的比较重要的设计决策: Kafka在设计之时为就将持久化消息作为通常的使用情况进行了考虑. 主要的设计约束是吞吐量 ...

  6. vue 使用v-cloak让在页面加载时不显示{{}}花括号

    官方说法: 这个指令保持在元素上直到关联实例结束编译. 和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准 ...

  7. CSS 设置网页中选中文字的背景色

    在样式文件中增加如下代码: ::selection { background: hsla(5, 92%, 76%, 0.8); color: #fff;}

  8. dede调用多级导航的方法

    <div id="navWrapper"> <div class="content"> <ul class="nav m ...

  9. html5 canvas 多个填充渐变形状

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. [转载]Remote Desktop Manager 9.0.10.0 Enterprise 附企业版注册码 (强大的远程控制软件)

    http://www.52xiazai.net/pcsoft/network/yuanchen/20131206/2429.html