最近学习了一下JTree的使用方法:

先来看一下树的实例:

构建一个树,

DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");

DefaultMutableTreeNode node = new DefaultMutableTreeNode("节点1");

root.add(node);

root.add(new DefaultMutableTreeNode("叶子节点3"));

node.add(new DefaultMutableTreeNode("叶子节点1"));

node.add(new DefaultMutableTreeNode("叶子节点2"));

DefaultTreeModel jMode = new DefaultTreeModel(root);

JTree tree = new JTree(jMode);

下面就是添加数据之后,java中默认的样式,

然后我们可以来改变数中的节点的图片,以及打开,折叠的样子:

DefaultTreeCellRenderer render=(DefaultTreeCellRenderer )tree.getCellRenderer();

//设置tree非叶子节折叠时的图片;

render.setClosedIcon(new ImageIcon(this.getClass().getResource("Arrow_right.png")));

//设置tree非叶子节点展开时的图片

render.setOpenIcon(new ImageIcon(this.getClass().getResource("right.png")));

//设置tree叶子节点的图片

render.setLeafIcon(new ImageIcon(this.getClass().getResource("chat_32.png")));

如图:

然后我们还可以来把前面的连接线给去掉:

tree.putClientProperty("JTree.lineStyle", "Horizontal");// 将树设为水平分隔风格

如图:

其他的一些基本设置:

tree.setFont(new Font(Font.SANS_SERIF, Font.LAYOUT_LEFT_TO_RIGHT, 18));

//字体的大小,样式

tree.setRowHeight(50);//树节点的高度

tree.setToggleClickCount(1); //设置展开节点之前的鼠标单击数为1

//设置一次自能选中一个节点tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

tree.setRootVisible(false);// 设置根节点为不可见;

如图:

所以从上面我们可以看出来,JTree的是由TreeNode构成的;

JTree和JList一样,都有一个Model以及TreeCellRenderer渲染器,树用Model模型来管理TreeNode,然后TreeCellRenderer渲染器则是负责Tree的样式。

我们也可以像JList一样通过重写来实现自定义的树。但是这里JTree需要改写的不是Model,而是TreeNode。

JTree,TreeModel,以及TreeNode,以及TreeCellRenderer:

在JTree中,每一个JTree由N个TreeNode构成,而TreeModel管理的是所有的TreeNode。TreeCellRenderer则是负责渲染每一个TreeNode。

TreeNode:在JTree中,可以说是负责数据的存储。在默认的节点DefaultMutableTreeNode中,JTree上显示的数据也就是文字是放的属性userObject(是一个Object对象)中,在上面的例子中我们的userObject存放的就是String型的对象。

TreeMode:是模型,也就是说,他负责把所有的TreeNode给联系起来。通过TreeMode我们可以知道,当前树的总的节点数,以及是否为叶子节点等。

TreeCellRenderer:渲染器,JAVA提供的渲染器,一般是一个JLabel对象,然后实现了TreeCellRenderer接口。根据Model传来的对象,进行包装——把该对象转换为String型然后显示在JLable上面。在TreeCellRenderer渲染器中得到的Value的值是一个TreeNode对象,TreeCellRenderer渲染的是每一个TreeNode。

自定义好友列表:

1.实现TreeNode,在自定义好友列表的TreNode里面,需要显示好友的名字(uName),以及个性签名(text),然后是一个头像(img),然后ID是用来唯一标示该节点,存储的是好友的ID。然后是考虑到数型结构,会有孩子节点(可以有多个孩子所以为一个数组),以及父节点。

public class FriTreeNode implements TreeNode{

private String ID;//该节点的ID号

private ImageIcon img;//节点存放图片

private String uName;//第一行文字(显示名字)

private String text;//第二行文字(显示签名)

private ArrayList children;//孩子节点

private TreeNode parent;//父亲节点

public FriTreeNode(String ID) {

this.ID=ID;

}

public FriTreeNode() {

}

public FriTreeNode(String name,String text,ImageIcon img,String ID) {

this.uName=name;

this.text=text;

this.img=img;

this.ID=ID;

}

/**

* @return the iD

*/

public String getID() {

return ID;

}

/**

* @param iD the iD to set

*/

public void setID(String iD) {

ID = iD;

}

/**

* @return the uName

*/

public String getuName() {

return uName;

}

/**

* @param uName the uName to set

*/

public void setuName(String uName) {

this.uName = uName;

}

/**

* @param parent the parent to set

*/

public void setParent(FriTreeNode parent) {

this.parent = parent;

}

/**

* @return the img

*/

public ImageIcon getImg() {

return img;

}

/**

* @param img the img to set

*/

public void setImg(ImageIcon img) {

this.img = img;

}

/**

* @return the text

*/

public String getText() {

return text;

}

/**

* @param text the text to set

*/

public void setText(String text) {

this.text = text;

}

public void addchild(FriTreeNode aChild){

if(children==null){

children=new ArrayList();

}

children.add(aChild);

aChild.parent=this;

}

/***

* 判断是否为根节点

* @return

*/

public boolean isroot(){

return (getParent()==null);

}

@Override

public TreeNode getChildAt(int childIndex) {

if (children == null) {

throw new ArrayIndexOutOfBoundsException("node has no children");

}

return children.get(childIndex) ;

}

@Override

public int getChildCount() {

if (children == null) {

return -1 ;

}

return children.size();

}

@Override

public TreeNode getParent() {

return parent;

}

@Override

public int getIndex(TreeNode aChild) {

if (aChild == null) {

throw new IllegalArgumentException("argument is null");

}

if (!isNodeChild(aChild)) {

return -1;

}

return children.indexOf(aChild);

}

@Override

public boolean getAllowsChildren() {

return true;

}

/**

* 判断是否是叶子节点

*/

@Override

public boolean isLeaf() {

return (getChildCount() ==-1)&&(getParent()!=null);

}

@SuppressWarnings("rawtypes")

@Override

public Enumeration children() {

return null;

}

public boolean isNodeChild(TreeNode aNode) {

boolean retval;

if (aNode == null) {

retval = false;

} else {

if (getChildCount() == 0) {

retval = false;

} else {

retval = (aNode.getParent() == this);

}

}

return retval;

}

}

2.实现 TreeCellRenderer,这里要注意区分一下好友节点以及根节点,还有好友分组节点的显示是不一样的,需要分别考虑。同时在JLable中的text属性是不能换行的,所以使用了HTML来设置JLable的Text值。

public class FriTreeRender extends JLabel implements TreeCellRenderer {

ImageIcon Arrow_right = new ImageIcon(this.getClass().getResource("Arrow_right.png"));//节点折叠时的图片

ImageIcon Arrow_down = new ImageIcon(this.getClass().getResource("Arrow_down.png"));//节点展开式的图片

@Override

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean

expanded,boolean leaf, int row, boolean hasFocus) {

FriTreeNode f = (FriTreeNode) value;//把value转换为节点

if (leaf && f.getParent() != tree.getModel().getRoot()) {//节点需要不为根节点,和根节点的孩子节点

/***************** 设置JLable的文字 ****************************/

String text = "" + f.getuName() + "
" + f.getText() + "

";

setText(text);// 设置JLable的文字

/**************************** 设置JLable的图片 *****************/

// 得到此图标的 Image,然后创建此图像的缩放版本。

Image img = f.getImg().getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT);

setIcon(new ImageIcon(img));// 设置JLable的图片

setIconTextGap(15);// 设置JLable的图片与文字之间的距离

} else { // 非叶子节点的文字为节点的ID

setText(f.getID());// 设置JLable的文字

if (expanded)//节点展开

setIcon(Arrow_down);

else

setIcon(Arrow_right);// 设置JLable的图片

}

return this;

}

}

3.然后就是和上面的实例一样去构建一个JTree了。

效果:

java仿qq好友列表_JTree实现QQ好友列表相关推荐

  1. Java仿QQ客户端(用JTree实现好友列表)

    仿QQ客户端 当前效果 登录界面 好友列表界面 当前效果 登录界面 首先,为了达到美观的目的,需要添加一张背景图片,我采用的方法是将图片添加到JLabel上,再将JLabel添加到界面上,但这样会面临 ...

  2. java仿qq思路_java仿QQ聊天软件OIM艰辛之路(开源项目)

    既然QQ能仿ICQ, 咱java也来个仿QQ. 在我刚学完java后,就想做点什么项目锻炼下自己的技能.凑巧的是,我一个同样学java的朋友在做一个仿qq的项目,不过他做的实在太丑了. 然后他想让我也 ...

  3. 如何判断对方列表里是不是好友_怎么判断QQ是不是被对方删除好友了_怎么知道对方QQ是否把我删了...

    很久没联系,QQ好友好像不存在一般,这时候有人就会想是不是被对方删除好友了呢?应该如何判断?下面是小编为大家整编的判断QQ被对方删除好友的方法,大家快来看看吧. 判断自己的QQ是不是被对方删除好友的方 ...

  4. 利用web端接口实现QQ好友列表获取、QQ群成员获取列表的实例分析

    当开放API成为历史潮流不可阻挡之时,腾讯亦只能与时俱进,但腾讯为了保持江湖的垄断地位,不会随意公开像QQ号这样的客户资源,于是乎,你能通过webQQ查询到的,也只能是用户或群的昵称,绝非QQ号码或群 ...

  5. html+css实现好友列表,类似QQ群聊成员列表

    html+css实现好友列表,类似QQ群聊成员列表. 1.最终效果图: 2.html部分: <body id="users"><div class="t ...

  6. qq好友列表获取之动态爬虫清洗爬取好友列表数据 - 获取qq好友、群、群成员列表

    qq好友列表获取之动态爬虫清洗爬取qq好友列表数据 - 获取qq好友ip.群.群成员列表.我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.c ...

  7. java仿QQ程序4.0

    下载链接  http://download.csdn.net/detail/qq245034548/8391381 4 详细设计 4.1 系统程序流程如下 图4.1.1 系统程序流程图 4.2 通讯协 ...

  8. java中qq好友怎么加,手机qq怎么加好友?

    手机QQ是一种常用的社交软件,那么,如何通过手机QQ添加好友呢?具体步骤如下. 打开手机QQ软件. 进入软件界面后,点击"联系人"按钮. 在"联系人"栏中,点击 ...

  9. c# webclient 保存会话信息_winform项目——仿QQ即时通讯程序16:会话列表的存储

    上一篇文章完成了验证消息的接收,这篇文章本打算做好友间互发消息,但是做的时候发现会话列表的存储还没做.就是会话列表中有会话的情况下,关闭了软件,然后再次登录后,应该要复现会话列表.因此本篇文章将实现会 ...

最新文章

  1. 面试官一个线程池问题把我问懵逼了。
  2. 整合rpc远程调用_远程过程调用(RPC)
  3. [云炬创业基础笔记]第二章创业者测试21
  4. Redhat 停止sendmail的方法
  5. python 序列化_python之序列化
  6. 有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利
  7. 怎么查看ubuntu是多少位和常用信息
  8. java 类.class_面试官:Java反射是什么?我回答不上来!
  9. redis aof 备份和恢复_Redis 持久化机制的介绍,了解这些流程很重要
  10. Java基础---接口是啥?
  11. [expimp]imp导入笔记
  12. vmware 虚拟机中有时获取不到IP地址
  13. ul在Firefox和IE下的不同表现
  14. R语言之高级数据分析「聚类分析」
  15. 技术重要还是能力重要?和大学生的MSN讨论记录
  16. 第26讲 js函数调用过程内存分析 js函数细节
  17. Py2,Py3的差异
  18. Linux14.04安装Mysql Linux公社
  19. mysql 触发器很慢_mysql之视图、触发器、事物、存储过程、函数、流程控制、索引与慢查优化...
  20. 【HDR学习】HDR视频相关知识讲解(一)

热门文章

  1. Linux坏掉检测,测起来!安兔兔评测Linux版上线 目前仅支持x86平台
  2. 女人要奋力抛弃爱情魔鬼
  3. dom相关的api操作
  4. Cartographer代码建图实现流程解析
  5. python 打包成为exe关于pyinstaller
  6. 聚类算法之K均值聚类
  7. 4月18号软件更新资讯合集
  8. 你尝过被人误会的委屈吗?看完本篇…
  9. 19香港补题(G)+cf思维
  10. python 操作隐藏删除 windows10 任务栏图标(Tray)(tools bar)