1. package com.swing.demo;
  2.  
  3. import java.awt.Component;
  4. import java.awt.event.MouseAdapter;
  5. import java.awt.event.MouseEvent;
  6. import java.util.ArrayList;
  7. import java.util.Enumeration;
  8. import java.util.List;
  9.  
  10. import javax.swing.JFrame;
  11. import javax.swing.JScrollPane;
  12. import javax.swing.JTree;
  13. import javax.swing.SwingUtilities;
  14. import javax.swing.event.TreeExpansionEvent;
  15. import javax.swing.event.TreeExpansionListener;
  16. import javax.swing.event.TreeSelectionEvent;
  17. import javax.swing.event.TreeSelectionListener;
  18. import javax.swing.tree.DefaultMutableTreeNode;
  19. import javax.swing.tree.DefaultTreeCellRenderer;
  20. import javax.swing.tree.DefaultTreeModel;
  21. import javax.swing.tree.TreeNode;
  22. import javax.swing.tree.TreePath;
  23. import javax.swing.tree.TreeSelectionModel;
  24.  
  25. import com.swing.model.User;
  26.  
  27. /**
  28. * JTree 常用方法.
  29. * @author Administrator
  30. *
  31. */
  32. public class TreeDemo {
  33. public static void main(String[] args) {
  34. final JTree tree = createTree();
  35. // 窗体设置
  36. JFrame frame = new JFrame("JTreeDemo");
  37. // 构造完树之后还要把树放在JScollPanel上,否则树显示会有问题
  38. JScrollPane treeView = new JScrollPane(tree);
  39. frame.add(treeView);
  40. frame.setSize(300, 300);
  41. frame.setVisible(true);
  42. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  43. // 添加树节点选择事件
  44. tree.addTreeSelectionListener(new TreeSelectionListener() {
  45.  
  46. @Override
  47. public void valueChanged(TreeSelectionEvent e) {
  48. // 取得TreePath
  49. // TreePath newPath = event.getNewLeadSelectionPath();
  50. // TreePath oldPath = event.getOldLeadSelectionPath();
  51. // 通过JTree取得Node
  52. // JTree tree = (JTree) event.getSource();
  53. // tree.getLastSelectedPathComponent();
  54. DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
  55. .getLastSelectedPathComponent();
  56. if (node == null) {
  57. return;
  58. }
  59.  
  60. Object object = node.getUserObject();
  61. if (node.isLeaf()) {
  62. User user = (User) object;
  63. System.out.println("你选择了:" + user.toString());
  64. }
  65.  
  66. // 取得根节点:
  67. TreeNode rootNode = (TreeNode) tree.getModel().getRoot();
  68. // 取得树的数据模型:
  69. DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
  70. // 取得树的某一个节点的位置:
  71. TreePath nodePath = new TreePath(treeModel.getPathToRoot(node));
  72. // 设置节点的展开选择和可见性:
  73. tree.setSelectionPath(nodePath);
  74. tree.makeVisible(nodePath);
  75. // 展开后滚动至节点可见:
  76. tree.scrollPathToVisible(nodePath);
  77. // 还有一个是设置鼠标点击展开树节点的(默认是双击,改成了0就是不可点击):
  78. tree.setToggleClickCount(1);
  79. // 另外就是一个设置Cell的高度的,但这个方法我们一般不用,大多时候是在Renderer里设置的,因为这样设置可能有UI问题:
  80. // tree.setRowHeight(15);
  81. }
  82.  
  83. });
  84. // 树节点展开(折叠) 事件
  85. tree.addTreeExpansionListener(new TreeExpansionListener() {
  86. @Override
  87. public void treeExpanded(TreeExpansionEvent event) {
  88. }
  89.  
  90. @Override
  91. public void treeCollapsed(TreeExpansionEvent event) {
  92. }
  93.  
  94. });
  95.  
  96. tree.addMouseListener(new MouseAdapter() {
  97. @Override
  98. public void mouseClicked(MouseEvent e) {
  99. if (SwingUtilities.isLeftMouseButton(e)
  100. && e.getClickCount() == 1) {
  101. // Returns the last path component
  102. DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
  103. .getLastSelectedPathComponent();
  104. } else if (SwingUtilities.isRightMouseButton(e)) {
  105. // Returns the row for the specified location.
  106. // int selectRow = tree.getRowForLocation(e.getX(),
  107. // e.getY());
  108. // Returns the path for the node at the specified location.
  109. TreePath selectPath = tree.getPathForLocation(e.getX(),
  110. e.getY());
  111. if (selectPath != null) {
  112. // set select
  113. tree.setSelectionPath(selectPath);
  114. // get tree node.
  115. DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) selectPath
  116. .getLastPathComponent();
  117. }
  118. }
  119. }
  120. });
  121.  
  122. // 渲染器
  123. tree.setCellRenderer(new DefaultTreeCellRenderer() {
  124. /**
  125. * serialVersionUID
  126. */
  127. private static final long serialVersionUID = 1L;
  128.  
  129. @Override
  130. public Component getTreeCellRendererComponent(JTree tree,
  131. Object value, boolean sel, boolean expanded, boolean leaf,
  132. int row, boolean hasFocus) {
  133. return super.getTreeCellRendererComponent(tree, value, sel,
  134. expanded, leaf, row, hasFocus);
  135. }
  136. });
  137. }
  138.  
  139. /**
  140. * createTree
  141. *
  142. * @return
  143. */
  144. private static JTree createTree() {
  145. // 创建没有父节点和子节点、但允许有子节点的树节点,并使用指定的用户对象对它进行初始化。
  146. // public DefaultMutableTreeNode(Object userObject)
  147. DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("软件部");
  148. node1.add(new DefaultMutableTreeNode(new User("小花")));
  149. node1.add(new DefaultMutableTreeNode(new User("小虎")));
  150. node1.add(new DefaultMutableTreeNode(new User("小龙")));
  151.  
  152. DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("销售部");
  153. node2.add(new DefaultMutableTreeNode(new User("小叶")));
  154. node2.add(new DefaultMutableTreeNode(new User("小雯")));
  155. node2.add(new DefaultMutableTreeNode(new User("小夏")));
  156.  
  157. DefaultMutableTreeNode top = new DefaultMutableTreeNode("职员管理");
  158. top.add(new DefaultMutableTreeNode(new User("总经理")));
  159. top.add(node1);
  160. top.add(node2);
  161. // JTree(TreeNode root)
  162. // 返回 JTree,指定的 TreeNode 作为其根,它显示根节点。
  163. JTree tree = new JTree(top);
  164. // 最终JTree也是通过setModel设置数据的:
  165. // tree = new JTree();
  166. // tree.setModel(treeModel);
  167. tree.getSelectionModel().setSelectionMode(
  168. TreeSelectionModel.SINGLE_TREE_SELECTION);
  169. return tree;
  170. }
  171.  
  172. private List<TreeNode> treeNodeList = new ArrayList<TreeNode>();
  173.  
  174. /**
  175. * 从任何节点递归其下所有的例子.
  176. *
  177. * @param treeNode
  178. */
  179. public void getChildNodeList(TreeNode treeNode) {
  180.  
  181. if (treeNode == null) {
  182. throw new RuntimeException("error treenode.");
  183. }
  184.  
  185. if (treeNodeList == null) {
  186. treeNodeList = new ArrayList<TreeNode>();
  187. }
  188.  
  189. if (treeNode.getChildCount() >= 0) {
  190. for (Enumeration<TreeNode> e = treeNode.children(); e
  191. .hasMoreElements();) {
  192. TreeNode childNode = (TreeNode) e.nextElement();
  193. treeNodeList.add(childNode);
  194. getChildNodeList(childNode);
  195. }
  196. }
  197. }
  198. }

JTree 常用方法的更多相关文章

  1. JTree常用方法

    private JTree jtNetDevice;//数组件申明private JScrollPane jspTree;//滚动面板申明 1.初始化     DefaultMutableTreeNo ...

  2. Java中的常用方法

    Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同    前缀 startsWith(String s).后缀 endsWit ...

  3. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  4. Jquery元素选取、常用方法

    一:常用的选择器:(李昌辉) 基本选择器 $("#myDiv") //匹配唯一的具有此id值的元素 $("div") //匹配指定名称的所有元素 $(" ...

  5. python浅谈正则的常用方法

    python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...

  6. C# Webbrowser 常用方法及多线程调用

    设置控件的值 /// <summary> /// 根据ID,NAME双重判断并设置值 /// </summary> /// <param name="tagNa ...

  7. list,tuple,dict,set常用方法

    Python中list,tuple,dict,set常用方法 collections模块提供的其它有用扩展类型 from collections import Counter from collect ...

  8. JTree实现好友列表

    最近学习了一下JTree的使用方法: 先来看一下树的实例: 构建一个树, DefaultMutableTreeNode root = new DefaultMutableTreeNode(" ...

  9. 记录yii2-imagine几个常用方法

    记录yii2-imagine几个常用方法: //压缩 Image::thumbnail('@webroot/img/test-image.jpg', 120, 120)->save(Yii::g ...

随机推荐

  1. js对数组的常用操作

    在js中对数组的操作是经常遇到的,我呢在这就列一下经常用到的方法 删除数组中的元素: 1.delete方法:delete删除的只是数组元素的值,所占的空间是并没有删除的 代码: var arr=[12 ...

  2. 图论:最短路-Bellman-Ford

    我们之前介绍了一种,(最常用的)SPFA算法,SPFA算法是对Bellman-Ford算法的队列优化,用队列替代了Bellman-Ford中的循环检查部分 然后这里我们介绍Bellman-Ford算法 ...

  3. vijos 1037 背包+标记

    描述 2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难.为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔. Mr. F有N块水晶,每块 ...

  4. LightOJ 1009 二分图染色+BFS/种类并查集

    题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...

  5. 编译 redis 报错 error: jemalloc/jemalloc.h: No such file or directory

    gcc编译redis时报错: zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2 ...

  6. VM 脚本回快照和开关机

    #Import PowerCLI*Get-Module -ListAvailable PowerCLI* | Import-Module #Resolve login issueSet-PowerCL ...

  7. Robot Framework 自定义关键字 Ignore error

    以上是关键字的完整写法. 一下是调用该关键字的实例.

  8. Chrome浏览器启动页被360导航篡改解决方法

    右键Chrome浏览器快捷方式,选择“属性”,在“目标”的结尾处有添加的网址,删了即可. 2 如果在结尾处没有任何网址,可以添加“ -nohome”,这样下次启动时,就会打开一个空白页,也就不会打开被 ...

  9. 【vijos】P1448 校门外的树

    [题意]两种操作,[L,R]种新的树(不覆盖原来的),或查询[L,R]树的种类数.n<=50000. [算法]树状数组||线段树 [题解]这题可以用主席树实现……不过因为不覆盖原来的,所以有更简 ...

  10. Vue 键盘事件

    Vue2键盘事件:keydown/keyup... 1.使用 <!DOCTYPE html> <html> <head> <title></tit ...