第二节:高级Swing组件JTee应用
目标: |
1. 掌握JTree应用,树节点的操作; 2. 使用JTree展数,管理对象。 |
1.JTree的创建:
在以上的示例中,我们都是创建默认的Javax.swing.JTree组件,本节就要示例,如何根据我们的需要创建自定义结构的JTree组件。首要明白的概念间:JTree上的节点分为两种,即枝节点和叶节点,其下有叶节点的,就称做枝节点,或称叶节点的父节点。
不论是叶节点,还是枝节点,在代码中,都是表现为一个javax.swing.tree.DefaultMutableTreeNode类的对象,DefaultMutableTreeNode有一个方法,可以将其它的DefaultMutableTreeNode对象加为自己的子节点;还有一个setUserObject(Object obj)和getUserObject方法,用来设定(或取得)节点内保存的对象。
请看如下代码,创建一个简单的树:
//JTree应用示例 public class TestJTree extends javax.swing.JFrame { //程序入口 public static void main(String[] args) { TestJTree tj=new TestJTree(); tj.init(); }
//初始化界面内容 public void init() { this.setTitle("东方标准JTree示例"); this.setSize(300, 400); java.awt.FlowLayout fl = new java.awt.FlowLayout(); this.setLayout(fl); // 将自己创建的树加到界面上: javax.swing.JTree tree = createTree(); this.add(tree); this.setDefaultCloseOperation(3); this.setVisible(true); } //创建一个自定义树 public javax.swing.JTree createTree() { // 创建默认树 javax.swing.JTree tree = new javax.swing.JTree(); // 首先,创建一个根节点: javax.swing.tree.DefaultMutableTreeNode rootNode = new javax.swing.tree.DefaultMutableTreeNode(); // 设定节点上的数据对象,节点显示标题则为设定对象的toString()值 rootNode.setUserObject("树的测试"); // 树下有5个组: for (int i = 0; i < 5; i++) { DefaultMutableTreeNode teamNode = new DefaultMutableTreeNode(); teamNode.setUserObject("第" + i + "组"); // 将组节点加到根节点上: rootNode.add(teamNode); for (int t = 0; t < 6; t++) { DefaultMutableTreeNode userNode = new DefaultMutableTreeNode(); userNode.setUserObject("第" + t + "个用户"); // 将用户节点加到组节点上: teamNode.add(userNode); } // 创建树的Model对象,创建时传入根节点: javax.swing.tree.DefaultTreeModel dm = new DefaultTreeModel( rootNode); // 将模型设给树,树上显示的将上前面所加载的节点 tree.setModel(dm); // 设定树上的图标 // ImageIcon leafIcon = new ImageIcon("src/budy_init.gif"); // DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); // renderer.setLeafIcon(leafIcon); // tree.setCellRenderer(renderer); } return tree; } } |
JTree创建时,关键的步骤就是:
1. 创建DefaultMutableTreeNode对象,设用其setUserObject设置节点的数据对象,这个节点的标签将显示为所设定(传入)的对象的toString方法返回值;
2. 给DefaultMutableTreeNode对象添加做为子节点的DefaultMutableTreeNode对象;
3. 将第一个,即要做为根节点的DefaultMutableTreeNode对象用来构造一个javax.swing.tree.DefaultTreeModel对象。
4. 将新建的DefaultTreeModel对象set给JTree对象即可。
比较简单吧,跟JMenu的应用方式差不了多少,就是一个一个的向上加。
JTree通常用来展示目录结构型的数据,例如学生管理系统中的分组和每组的学生数据;现在,假设我们要编写一个学生的日志管理系统,将界面用JTree展示:
2.用JTree展示学生日志系统界面:
假设我们要做一个学生日志管理系统:即每个学生每天都要写一篇学习日志,通过我们的程序保存和查看:
1.系统中就必须存在学生对象和每个学生的日志对象;我们首先要编写一个学生类和日志类。
2.系统中一个学生对象可能会有多个日志对象;
3.每个日志对象肯定属于某一个学生对象。
4.通过一个JTree组件展示,JTree上的每个一级节点为一个学生对象,点击后,展示出下面的子节点为用户的日志对象。
经过简单的分析:
学生类必须有的属性:id,name,age
日志类必须有的属性:所属学生的id,title,content,createTime
学生类代码如下:
import java.util.ArrayList; import java.util.List; //学生类定义 public class UserInfo { private int id; private String name; private int age; // 一个学生对象,有属于自己的多个日志对象,在其内部用队列存放 private List<UserBlog> blogList = new ArrayList(); // 为某个学生的日志队列中加入一个日志对象 public void addBlog(UserBlog blog) { blogList.add(blog); } // 取得学生的所有日志对象 public List<UserBlog> getBlogList() { return this.blogList; } // 对应的get/set各属性的方法: public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
日志类定义的代码如下(随后的代码中,将省略属性对应的get/set方法):
//日志类定义 public class UserBlog { private int id; private int id_userInfo;// 日志所属学生对象的学生ID private String title; private String content; private String createTime;// 日志创建时间 yyyymmddhh格式 // 一篇日志所属的学生对象 private UserInfo userinfo; // 以下为对应属性的get/set方法. . . |
以上代码需要特别注意的是:学生类在定义时,要考虑到每个学生对象与其日志对象的对应关系,这种关系,可以在设计类时定义好,后面使用时就非常方便:
学生对象与日志对象之间的关系,可以描述为:
1.一个学生对象,有多个日志对象,这是一对多的关系;在学生类定义时,代码体现为:
. . . // 一个学生对象,有属于自己的多个日志对象,在其内部用队列存放 private List<UserBlog> blogList = new ArrayList(); // 为某个学生的日志队列中加入一个日志对象 public void addBlog(UserBlog blog) { blogList.add(blog); } // 取得学生的所有日志对象 public List<UserBlog> getBlogList() { return this.blogList; } . . . |
对于使用UserInfo对象的其它对象而言,只要调用UserInfo对象的getBlogList即可得到这个对象的所有日志对象。
2.每个日志对象,都有自己所属的一个学生对象,这是多对一的关系;UserBlog类中体现为:
. . . private int id_userInfo;// 日志所属学生对象的学生ID private UserInfo userinfo; // 一篇日志所属的学生对象 //得到或设定日志对象所属的UserInfo对象 public UserInfo getUserinfo() { return userinfo; } public void setUserinfo(UserInfo userinfo) { this.userinfo = userinfo; } public int getId_userInfo() { return id_userInfo; } public void setId_userInfo(int id_userInfo) |