<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 12">
<meta name="Originator" content="Microsoft Word 12">
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_editdata.mso">
<!--[if !mso]>
<style>
v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Cphoenix%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">
<!--[if gte mso 9]><xml>
Normal
0
false
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:0 0 0 0 0 0 0 0 0 0;
mso-font-alt:"Times New Roman";}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","serif";}
</style>
<![endif]-->
前面已经把树的基本使用、树的事件和树的数据取得写完了,并看了一个Sun提供的最简单的树的例子,这一专题我们讲两个方面,一个是使用树的Renderer和Editor构造一棵我们自己的树;一个树使用SwingWorker完成一棵资源管理器树的加载.
先看渲染的例子:
<!--[if gte vml 1]>
<![endif]-->
<!--[if gte vml 1]>
<![endif]-->
我们为我们的树增加了可用与否、可见与否和节点图片的属性,当然你也可以自己添加想要的属性,比如顺序等.
整个实现的过程很清晰,也不复杂,我们首先实现我们自己的TreeNode,它继承于DefaultMutableTreeNode,我们在里面添加自己的属性;然后是实现树的节点的Renderer和Editor,在Renderer里我们设置可用也否,选择状态,节点图片等;在Editor里我们设置树的容器布局.最后构造树时使用setRenderer和setEditor就可以了,需要注意的是如果仅仅是呈现,设置Renderer就可以了,如果除了呈现还有操作的话,必须都要设置.
先看我们自己的TreeNode类, 继承于DefaultMutableTreeNode,
/**
* the tree node that I rewrite it.
*/
publicclass MyTreeNode extends
DefaultMutableTreeNode {
我们添加了属性:
/** is
select or not. */
privatebooleanisSelected = false;
节点的选择状态
/** is
enable. */
privatebooleanenabled = false;
节点使用与否
/** is
visible or not. */
privatebooleanisVisible = false;
节点可见与否
/** it's
icon. */
private Icon icon = null;
/** icon
name. */
private String iconName = null;
节点图片和图片名字
然后是构造函数,我们初始化属性,或使用默认的:
public MyTreeNode() {
this(null, true, false, true, true, null);
}
public MyTreeNode(Object userObject, boolean allowsChildren,
boolean isSelected, boolean enabled, boolean isVisible, Icon icon) {
super(userObject, allowsChildren);
this.isSelected = isSelected;
this.enabled = enabled;
this.isVisible = isVisible;
this.icon = icon;
setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTI
ON);
}
然后就是一些设置和取得属性的方法,这个类就相当于一个Bean.
然后就是Rnederer了,我们这里继承于DefaultTreeCellRenderer
publicclass MyTreeRenderer extends
DefaultTreeCellRenderer {
然后复写它的getTreeCellRendererComponent方法:
@Override
public Component getTreeCellRendererComponent(JTree
tree, Object value, boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
然后设置节点的属性:
首先是显示文本:
String stringValue = tree.convertValueToText(value, sel,
expanded, leaf, row, hasFocus);
setText(stringValue);
然后是可用与否:
boolean
nodeIsEnabled = ((MyTreeNode) value).isEnabled();
boolean isEnabled =
(treeIsEnabled && nodeIsEnabled);
setEnabled(isEnabled);
然后是是图片
Icon icon = ((MyTreeNode) value).getIcon();
setIcon(icon);
还有一些基本的属性,比如背景色等:
setForeground(getTextSelectionColor());
再来需要看的类就是Editor了,它继承于DefaultTreeCellEditor:
publicclass MyCellEditor extends
DefaultTreeCellEditor {
因为我们使用的是JLabel作为显示控件,所以我们的主要实现是布局处理,对于事件可以不需要考虑.我们复习了DefaultTreeCellEditor的默认布局:
/**
*
Container responsible for placing the editingComponent.
*/
privateclass MyEditorContainer extends
DefaultTreeCellEditor.EditorContainer
{
复写它的doLayout方法:
@Override
publicvoid doLayout() {
取得节点的边缘和大小:
r = tree.getBounds(r);
eSize.width = r.width - (offset * n);
editingComponent.setLocation(offset, 0);
设置节点的位置和大小:
setSize(new Dimension(eSize.width + offset, cSize.height));
最后就是使用了,很简单和以前一样,直接使用JTree的设置方法就可以了:
MyTreeRenderer renderer = new MyTreeRenderer();
tree.setCellRenderer(renderer);
tree.setEditable(true);
tree.setCellEditor(new
MyCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer()));
分享到:
相关推荐
JTree的例子,可以拖动节点 JTree的例子,可以拖动节点
jtree节点可编辑
jtree添加图片--(不同的节点图片),源代码,欢迎学习。
jtree和QQ项目 树上闪动的节点动态化(根据QQ号来消息闪动)
jtree目录树,学习目录树的同学可以参考参考,js实现的,可以动态的无限添加目录树节点,非常方便
jtree树案例,jtree中树的比较经典案例,很好。
JTree 树形菜单插件包下载,在网页上快速实现树控菜单的一个小插件,功能相对完善,本次更新功能:加入treeNodes(数组形式),通过treeNodes可以对指定的子树进行收缩和展开功能,查找指定节点的功能。加入这个功能...
使用JTree实现的文件资源管理器(仿照Windows操作系统)
JTree2.0 目录树 js目录树JTree2.0 目录树 js目录树JTree2.0 目录树 js目录树
JTree上的每一个节点就代表一个TreeNode对象,TreeNode本身是一个Interface,里面定义了7个有关节点的方法,例如判断是否 为树叶节点、有几个子节点(getChildCount())、父节点为何(getparent())等等、这些方法的定义...
实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。
JTree(节点带有checkbox)代码实例
公司做了一个项目,由于JTREE面临着近40万的数据量。虽然初始化这些数据问题...每次树要加栽的时候先显示“正在加载...”,当结构从ActiveMQ进行返回的时候,再重新渲染此树。例子我打包传到我的资源里面。需要的下
jtree和QQ项目\树上实现了弹出聊天窗口(传递了当前点击的树节点的图片和文字)
JTree2.0 目录树 树形菜单 菜单导航 经各浏览器测试。javascript脚本实现。
jwuery树jtree,此代码可以帮助学习java的同学更好的学习
java使用jtree动态实现二叉树,包含二叉树的插入删除很查找
1. 掌握JTree应用,树节点的操作; 2. 使用JTree展数,管理对象。
JTree的使用 JTree的使用 JTree的使用