http://www.java3z.com/cwbwebhome/article/article5/51342.html?id=4306
相信读者都清楚树在图形界面的重要性,但JAVA自带的JTree功能狭窄,运用起来非常的不方便,不灵活,比如在已经添加的节点中不能更改其文本信息和图片信息,而且所有的叶子节点的图片都是通过DefaultTreeCellRenderer的方法setLeafIcon()来实现的,所以全部的叶子节点的图片都是一样,这点在实际的软件开发中是一个致命的漏洞,比如腾讯QQ 的好友就是一棵树,总不可能全部好友的头像都一样吧,为此,笔者将通过自己的经验重写DefaultTreeCellRenderer类,让我们在开发中更灵活的运用树的组件。
要重写DefaultTreeCellRenderer,又要不失去它本身的功能,唯一的办法就是继承它,拓展它的方法,不仅要继承该类,我们还要继承DefaultMutableTreeNode类,使我们的节点更加丰富
下面笔者将创建类IconNodeRenderer继承类DefaultTreeCellRenderer,
创建类IconNode继承DefaultMutableTreeNode
为了更方便的使用我们自定义的树,笔者将这两个类封装在一个文件里,便于管理
代码如下:
import java.awt.Component;
import javax.swing.Icon;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
public class IconNodeRenderer extends DefaultTreeCellRenderer//继承该类
{
//重写该方法
public Component getTreeCellRendererComponent(JTree tree, Object value,boolean sel,
boolean expanded, boolean leaf, int row,boolean hasFocus)
{
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,row, hasFocus); //调用父类的该方法
Icon icon = ((IconNode) value).getIcon();//从节点读取图片
String txt=((IconNode) value).getText(); //从节点读取文本
setIcon(icon);//设置图片
setText(txt);//设置文本
return this;
}
}
//定义节点类
class IconNode extends DefaultMutableTreeNode
{
protected Icon icon;
protected String txt;
//只包含文本的节点构造
public IconNode(String txt)
{
super();
this.txt=txt;
}
//包含文本和图片的节点构造
public IconNode(Icon icon,String txt)
{
super();
this.icon = icon;
this.txt = txt;
}
public void setIcon(Icon icon)
{
this.icon = icon;
}
public Icon getIcon()
{
return icon;
}
public void setText(String txt)
{
this.txt=txt;
}
public String getText()
{
return txt;
}
}
现在我们写一个测试函数来看看我们定义的树,顺便看看如何使用
一样得先准备及张16x16的小图片
代码如下:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;
import com.jtattoo.plaf.bernstein.BernsteinLookAndFeel;
public class text
{
JFrame frame;
public text()
{
try
{
UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
}catch(Exception e){}
frame=new JFrame("树");
frame.setSize(150,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
IconNode root1=new IconNode(new ImageIcon("3.png"),"高中同学");
IconNode root2=new IconNode(new ImageIcon("3.png"),"初中同学");
root1.add(new IconNode(new ImageIcon("5.png"),"雅君"));
root1.add(new IconNode(new ImageIcon("1.png"),"伟旭"));
root1.add(new IconNode(new ImageIcon("2.png"),"宜群"));
root2.add(new IconNode(new ImageIcon("2.png"),"彬强"));
root2.add(new IconNode(new ImageIcon("1.png"),"小强"));
IconNode Root=new IconNode(null,null);//定义根节点
Root.add(root1);//定义二级节点
Root.add(root2);//定义二级节点
final JTree tree = new JTree(Root);//定义树
tree.setCellRenderer(new IconNodeRenderer()); //设置单元格描述
tree.setEditable(false); //设置树是否可编辑
tree.setRootVisible(false);//设置树的根节点是否可视
tree.setToggleClickCount(1);//设置单击几次展开数节点
DefaultTreeCellRenderer cellRenderer=(DefaultTreeCellRenderer)tree.getCellRenderer();//获取该树的Renderer
cellRenderer.setClosedIcon(new ImageIcon("2.gif"));//关闭打开图标
cellRenderer.setOpenIcon(new ImageIcon("2.gif"));//设置展开图标
//测试事件
tree.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)//双击节点
{
TreePath path=tree.getSelectionPath();//获取选中节点路径
IconNode node=(IconNode)path.getLastPathComponent();//通过路径将指针指向该节点
if(node.isLeaf())//如果该节点是叶子节点
{
//DefaultTreeModel model=(DefaultTreeModel)tree.getModel();//获取该树的模型
//model.removeNodeFromParent(node);//从本树删除该节点
node.setIcon(new ImageIcon("3.png"));//修改该节点的图片
node.setText("双击");//修改该节点的文本
tree.repaint();//重绘更新树
System.out.println(node.getText());
}
else//不是叶子节点
{
}
}
}
});
JScrollPane sp = new JScrollPane(tree);
frame.getContentPane().add(sp, BorderLayout.CENTER);
frame.setVisible(true);
}
public static void main(String[] args)
{
new text();
}
}
运行结果如下:
看看,我们设置了不同的头像了,而且我们拓展了DefaultTreeCellRenderer所没有的方法
setText(),getText(),setIcon(),getIcon()等四个方法来修改节点的信息。
分享到:
相关推荐
### 如何使用JTree:详解与实践 #### JTree简介 `JTree`是Java Swing中的一个组件,用于展示层次化的数据结构。它允许用户在应用程序中构建树形视图来表示目录结构、组织结构图等。`JTree`继承自`JComponent`类,...
`jtree`标题所指的可能是关于如何在`JTree`中添加复选框(checkboxes)的功能。这通常是为了让用户能够多选树中的节点,进行批量操作或者进行选择确认。在描述中提到的"实用哦"表明添加复选框能提高用户交互的便利性...
这个例子展示了如何实现一个可拖动节点的`JTree`,这在用户界面设计中是一个常见且实用的功能,特别是在需要展示层次结构信息时。`JTree`允许用户通过拖放操作来重新排列节点,提高交互性和用户体验。 拖放(Drag ...
**JTree 深度解析** `JTree` 是Java Swing库中的一个重要组件,它用于在用户界面中显示树状数据结构。这个组件允许用户以图形化的方式浏览和操作层次结构的数据,例如文件系统目录、数据库结构或者组织结构图。在...
标题中的"Jtree"很可能指的是这个Java组件,而描述中的“XML的树形目录,转载”则暗示了JTree可能被用在解析和展示XML文档结构的场景中。 XML(可扩展标记语言)是一种用于存储和传输数据的格式,它的结构是基于树...
实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。
它提供了与Java JTree类似的功能,但适用于Web环境,无需服务器端Java支持。 2. **JavaScript基础**: JavaScript是一种客户端脚本语言,用于增强网页的交互性和动态性。在实现JTree时,JavaScript用于处理DOM操作...
这些代码可能涵盖了更复杂的功能,比如自定义渲染器、拖放操作、数据绑定等,学习这些代码可以帮助开发者更好地理解和应用JTree和JTable在实际项目中的各种用法。 总之,JTree和JTable是Java GUI编程中不可或缺的...
`jenkov-prizetags-doc-3.4.0.zip`压缩包提供的JTree Doc文档是开发者学习和查阅`JTree`功能的重要参考资料。 **Javadoc概述** Javadoc是一种特殊的注释方式,它能够自动生成关于Java源代码的文档。通过`javadoc`...
在Java Swing库中,`JTree`和`JTable`是两种非常重要的组件,用于创建用户界面。`JTree`通常用于展示层次化的数据结构,而`JTable`则适用于二维表格数据的显示和操作。本项目是关于如何在Java应用程序中结合使用这两...
在`JTree2.0`版本中,这个组件得到了进一步的改进和增强,提供更丰富的功能和更好的用户体验。在本文中,我们将深入探讨`JTree`的核心概念、主要特性以及如何在实际项目中有效利用`JTree2.0`。 1. **核心概念** - ...
通过本文的介绍,我们可以看到`JTree`是一个功能强大的Swing组件,能够帮助开发者轻松地在Java应用程序中展示层次化的数据。无论是构建复杂的组织结构还是简单的文件系统视图,`JTree`都能够胜任。掌握`JTree`的使用...
JTree支持编辑节点的文本,需要启用`JTree`的编辑功能。这通常通过设置`TreeCellEditor`和`TreeCellRenderer`来实现。在日志管理系统中,可能需要编辑节点以更新日志条目。要实现编辑,可以调用`JTree`的`...
### JTree的用法详解 ...通过合理的使用节点类型和事件监听器,可以创建出功能强大的用户界面。对于初学者来说,掌握 `JTree` 的基本使用方法是非常重要的,这有助于更好地理解 Java Swing 框架的高级特性。
在压缩包文件"Jtree"中,可能包含了用于演示此功能的源代码。确保解压并检查这些文件,以获取更具体的实现细节。此外,你还可以根据需求调整代码,比如通过监听节点选择事件来改变图标,或者根据节点状态动态加载...
本文将详细介绍`JTree`的各种使用方法,包括如何创建、自定义外观、以及一些高级功能的实现。 #### 自动展开树 `JTree`可以通过编程方式来控制其展开和折叠的行为。例如,下面的代码展示了如何创建一个`JTree`并...
- **拖放功能**: `JTree`支持拖放操作,用户可以移动或复制节点到其他位置。 - **图标支持**: 每个节点可以关联一个图标,表示其状态,如打开、关闭、叶子节点等。 - **键盘导航**: 用户可以通过键盘进行导航和...
在Java编程中,`JTree`是Swing库中的一个组件,用于展示树形数据结构。这个组件在GUI(图形用户界面)应用中非常...在实际项目中,这样的功能可能应用于文件系统的浏览、组织结构的展示或其他需要层次结构展示的场景。
在Java Swing库中,JTree组件是一个非常有用的可视化控件,用于展示层次化的数据结构,如文件系统目录或组织结构图。这篇博文将探讨如何在Java应用程序中有效地使用JTree。 首先,理解JTree的基本概念至关重要。...
但是,JAVA 自带的 JTree 功能狭窄,运用起来非常的不方便,不灵活。例如,在已经添加的节点中不能更改其文本信息和图片信息,而且所有的叶子节点的图片都是通过 DefaultTreeCellRenderer 的方法 setLeafIcon() 来...