JTree用法大全汇总.docx
《JTree用法大全汇总.docx》由会员分享,可在线阅读,更多相关《JTree用法大全汇总.docx(19页珍藏版)》请在冰点文库上搜索。
JTree用法大全汇总
JTree用法
1。
自动展开树
packagetestpicturejava;
importjava.awt.*;
importjavax.swing.*;
importjavax.swing.tree.TreeNode;
importjavax.swing.tree.TreePath;
importjava.util.Enumeration;
publicclassJTreeFrameextendsJFrame{
publicJTreeFrame(){
try{
jbInit();
}catch(Exceptionexception){
exception.printStackTrace();
}
}
privatevoidjbInit()throwsException{
getContentPane().setLayout(null);
setSize(newDimension(434,347));
setTitle("JTreeFrameTitle");
jScrollPane1.setBounds(newRectangle(9,9,429,317));
this.getContentPane().add(jScrollPane1);
expandTree(jTree1);
jScrollPane1.getViewport().add(jTree1);
}
/** *完全展开一个JTree *@paramtreeJTree */
publicstaticvoidexpandTree(JTreetree){
TreeNoderoot=(TreeNode)tree.getModel().getRoot();
expandAll(tree,newTreePath(root),true);
}
/** *完全展开或关闭一个树,用于递规执行 *@paramtreeJTree *@paramparent父节点 *@paramexpand为true则表示展开树,否则为关闭整棵树 */
privatestaticvoidexpandAll(JTreetree,TreePathparent,booleanexpand){
//Traversechildren
TreeNodenode=(TreeNode)parent.
getLastPathComponent();
if(node.getChildCount()>=0){
for(Enumeratione=node.children();e.hasMoreElements();){
TreeNoden=(TreeNode)e.nextElement();
TreePathpath=parent.pathByAddingChild(n);
expandAll(tree,path,expand);
}
}//Expansionorcollapsemustbedonebottom-up
if(expand){
tree.expandPath(parent);
}else{
tree.collapsePath(parent);
}
}
JScrollPanejScrollPane1=newJScrollPane();
JTreejTree1=newJTree();
}
2。
用最简便的方法更换JTREE图标
最近为一个程序写界面,需要更换JTree的默认图标,因为以前从没做过swing,走了不少弯路,现在把方法告诉大家,希望对你的工作能有所帮助.
先来一个常见的图标更换方法,需要显示继承DefaultTreeCellRenderer类
privateclassMyRendererextendsDefaultTreeCellRenderer{
ImageIconhtmlIcon;
ImageIconimageIcon;
publicMyRenderer(){
htmlIcon=newImageIcon("source/html.gif");
imageIcon=newImageIcon("source/image.gif");
}
publicComponentgetTreeCellRendererComponent(
JTreetree,
Objectvalue,
booleansel,
booleanexpanded,
booleanleaf,
introw,
booleanhasFocus){
super.getTreeCellRendererComponent(
tree,value,sel,
expanded,leaf,row,
hasFocus);
if(leaf&&isImage(value)){
setIcon(imageIcon);
//setToolTipText("ThisbookisintheTutorialseries.");
}
elseif(leaf){
setIcon(htmlIcon);
}
returnthis;
}
protectedbooleanisImage(Objectvalue){
Sitemarks.SitemarkEntrynode=
(Sitemarks.SitemarkEntry)value;
Stringname=
(String)(node.getName());
if(name.endsWith(".jpg")||name.endsWith(".gif")){
returntrue;
}
returnfalse;
}
}
实现起来太麻烦了,我只是想换个图标而已,java也太不讲人情了,需要写这么多代码.于是我尝试这样直接设置:
JTreeleftTree=newJTree();
((DefaultTreeCellRenderer)leftTree.getCellRenderer()).setClosedIcon(myClosedIcon);
这样的问题是,如果你需要动态增删JTree的结点,调用UpdateUI()方法后,显示的图标又变为默认的图标.你还得在调用updateUI()后重新调用上面语句.
最后我想到使用匿名类的方法如下:
leftTree.setCellRenderer(newDefaultTreeCellRenderer(){
publicIcongetClosedIcon(){
//返回你需要的图标
return myClosedIcon
}
});
3。
JTree使用经验总结
在实际开发过程中会经常使用JTree组件,平时会遇到这样或那样的问题,在此将偶得一点经验写下来,与大家共享,希望对大家有所帮助。
privateJTreejtNetDevice;//数组件申明
privateJScrollPanejspTree;//滚动面板申明
1、初始化
DefaultMutableTreeNoderootNode=newDefaultMutableTreeNode("root");
jtNetDevice=newJTree(rootNode);
jtNetDevice.setAutoscrolls(true);
getTreeSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//设置单选模式
jspTree=newJScrollPane();
jspTree.getViewport().add(jtNetDevice,null);
2、三个经常使用的取值函数
privateDefaultTreeModelgetTreeModel(){
return(DefaultTreeModel)jtNetDevice.getModel();
}
privateDefaultMutableTreeNodegetRootNode(){
return(DefaultMutableTreeNode)getTreeModel().getRoot();
}
privateTreeSelectionModelgetTreeSelectionModel(){
returnjtNetDevice.getSelectionModel();
}
3、根据node得到path:
TreePathvisiblePath=newTreePath(getTreeModel().getPathToRoot(node));
4、根据Path展开到该节点
jtNetDevice.makeVisible(visiblePath);
5、根据path设定该节点选定
jtNetDevice.setSelectionPath(visiblePath);
6、选中节点的方法
首先,根据节点得到树路径,其中chosen为需要选中的节点
TreePathvisiblePath=newTreePath(((DefaultTreeModel)jtNetDevice.getModel()).
getPathToRoot(chosen));
然后根据Path选中该节点
jtNetDevice.setSelectionPath(visiblePath);
7、滚动到可见位置
jtNetDevice.scrollPathToVisible(visiblePath);
8、给JTree添加右键弹出菜单
voidjtNetDevice_mouseReleased(MouseEvente){
if(e.isPopupTrigger()){
jPopupMenu1.show(e.getComponent(),e.getX(),e.getY());//弹出右键菜单
}
}
9、关于JTree的展开
//Ifexpandistrue,expandsallnodesinthetree.
//Otherwise,collapsesallnodesinthetree.
publicvoidexpandAll(JTreetree,booleanexpand){
TreeNoderoot=(TreeNode)tree.getModel().getRoot();
//Traversetreefromroot
expandAll(tree,newTreePath(root),expand);
}
privatevoidexpandAll(JTreetree,TreePathparent,booleanexpand){
//Traversechildren
TreeNodenode=(TreeNode)parent.getLastPathComponent();
if(node.getChildCount()>=0){
for(Enumeratione=node.children();e.hasMoreElements();){
TreeNoden=(TreeNode)e.nextElement();
TreePathpath=parent.pathByAddingChild(n);
expandAll(tree,path,expand);
}
}
//Expansionorcollapsemustbedonebottom-up
if(expand){
tree.expandPath(parent);
}else{
tree.collapsePath(parent);
}
}
10、如何遍历JTree
// 创建树
JTreetree=newJTree();
//添加树节点......
// 遍历所有节点
visitAllNodes(tree);
// 仅遍历展开的节点
visitAllExpandedNodes(tree);
//Traverseallnodesintree
publicvoidvisitAllNodes(JTreetree){
TreeNoderoot=(TreeNode)tree.getModel().getRoot();
visitAllNodes(root);
}
publicvoidvisitAllNodes(TreeNodenode){
//nodeisvisitedexactlyonce
process(node);
if(node.getChildCount()>=0){
for(Enumeratione=node.children();e.hasMoreElements();){
TreeNoden=(TreeNode)e.nextElement();
visitAllNodes(n);
}
}
}
//Traverseallexpandednodesintree
publicvoidvisitAllExpandedNodes(JTreetree){
TreeNoderoot=(TreeNode)tree.getModel().getRoot();
visitAllExpandedNodes(tree,newTreePath(root));
}
publicvoidvisitAllExpandedNodes(JTreetree,TreePathparent){
//Returnifnodeisnotexpanded
if(!
tree.isVisible(parent)){
return;
}
//nodeisvisibleandisvisitedexactlyonce
TreeNodenode=(TreeNode)parent.getLastPathComponent();
process(node);
//Visitallchildren
if(node.getChildCount()>=0){
for(Enumeratione=node.children();e.hasMoreElements();){
TreeNoden=(TreeNode)e.nextElement();
TreePathpath=parent.pathByAddingChild(n);
visitAllExpandedNodes(tree,path);
}
}
}
4。
JTree的事件监听
importjavax.swing.tree.*;
importjavax.swing.event.TreeSelectionEvent;
importjavax.swing.event.TreeSelectionListener;
使用流程:
1,JTreetree=createTree();//得到JTree对象,createTree()见文后
2,DefaultTreeCellRendererrender=newDefaultTreeCellRenderer();
tagTree.setCellRenderer(render);//设置Tree的Render模式
3,thdTree.addTreeSelectionListener(
newTreeSelectionListener()
{
publicvoidvalueChanged(TreeSelectionEvente){
}
}
);//增加选中节点的监听器
privatevoidcreateTree()
{
//一般构造方法
JTreetree;
DefaultMutableTreeNoderoot=newDefaultMutableTreeNode("Root");
DefaultTreeModeltreeModel=newDefaultTreeModel(root);
root.setAllowsChildren(true);
tree=newJTree(treeModel);
DefaultTreeCellRenderertreeRender=new DefaultTreeCellRenderer();
treeRender.setOpaque(true);
tree.setCellRenderer(treeRender);
ToolTipManager.sharedInstance().registerComponent(tree);
tree.setName("tagTree");
returntree;
}
5。
使用jdom操作xml数据,生成含Jtree的applet
关键词:
xml,jdom,applet,jtree
在我们工作中,常常会碰到树形组件的生成问题,如果你在开发web application,纯粹使用
javascript来生成树形组件是非常繁琐的,而且交互性也不不太好。
所以许多产品使applet来实现树形组件的功能。
比如说,weblogic,jboss等产品的console.所以,把树形数据组织成xml文件,用jdom剖析它,最后生成applet就非常有通用的意义。
下面,我就给出一个例子,抛砖引玉。
1.准备一个存有属性数据的xml文件,把它放在classpath中,我这里是org.xml。
[pre]
xml version="1.0" encoding="UTF-8"?
>
--Sample XML file generated by XMLSPY v5 rel. 3 U ([url][/url])-->