第二节:高级Swing组件JTee应用

本文详细介绍了如何使用Java Swing的JTree组件来创建自定义结构的树形视图,特别地,展示了在学生日志管理系统中,如何利用JTree展示学生及其日志的层次结构。首先,讲解了JTree的创建步骤,包括创建DefaultMutableTreeNode对象并设置数据对象,然后构建DefaultTreeModel,并将其设置给JTree。接着,讨论了学生类和日志类的设计,包括它们之间的关系。最后,模拟生成了用户数据对象并展示在JTree上。
摘要由CSDN通过智能技术生成

                                                                  第二节:高级Swing组件JTee应用

目标:

1. 掌握JTree应用,树节点的操作;

2. 使用JTree展数,管理对象。

1.JTree的创建: 2

2.JTree展示学生日志系统界面: 4

3.JTree节点的选中和信息获取 9

4.JTree的编辑《日志管理实现》: 13

5.完善分析 20

总结和任务: 23

 

 

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对象setJTree对象即可。

    比较简单吧,跟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) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值