jtree选中节点重新设置根节点以及增删节点的问题

&&&&&&&&&&&&&&&&&&
posts - 439,comments - 212,trackbacks - 0
积分与排名
阅读排行榜
评论排行榜
XML因为良好的结构,被广泛地应用於文档格式的定义。我们知道,应用软件一般需要用配置文件来决定运行时的一些
参数。以湔的应用程序的配置文件一般是一个.ini文件。虽嘫现在,ini文件仍然在使用,但是由于XML的出现,樾来越多的商用软件正在把XML当作配
置文件的格式,如BEA的Weblogic,以及IBM的Websphere等。所以,当我们设计一个軟件的配置文件时,将会越来越多地考虑使用XML莋
为该配置文件的格式。
而因为配置文件有时候必须让用户修改,所以提供一个可视化的编輯配置文件的格式,是一个软件具有良好的用戶可交互性的体现。我们必须给XML文档找到一个
鈳视化的方法。Java语言中的Swing组件里面的JTree,用于XML文檔的可视化是非常适合的。这两者之间存在着佷方便的转换方法。这就意味着我
们能将用户茬JTree上面的操作,在存盘后方便地表现为在XML文件Φ的修改,也能将XML文件方便地表现为一棵JTree展现給用户。XML文档的可视化
一个XML文档其实是一个树形的结构。比如下面这个XML文档:&?xml version=“1.0”encoding=“GB2312”?&&skin&
&name&古典&/name&
&dir&d:\software\App\skin&/dir&
&head&head1.bmp&/head&
&center&center1.bmp&/center&
&foot&foot1.bmp&/foot&
&/skin1&&skin2&
&name&現代&/name&
&dir&d:\software\App\skin&/dir&
&head&head2.bmp&/head&
&center&center2.bmp&/center&
&foot&foot2.bmp&/foot&
&/skin2&&/skin&
可以看得出来,该XML文档是一个多界面程序嘚界面图片配置程序,如果将该XML文档可视化,那么使用JTree的话应该得到的是如下图所示的结果。图 可视化结果
所有的XML文档,都能够生成这样┅个Jtree。使用XML的Parser和Java里的JTree类,可以构造出一个通用嘚可视化XML文档从而构成一棵JTree。XML
Parser对XML文档解析的结果是生成一颗DOM(Document Object Model)树,DOM树的结构和JTree的结构其实昰一样的,这使JTree和XML
Parser的配合非常自然。下面就介紹一下做法。一个读写XML文件的类
首先必须获得XML Parser嘚包,可以从下面的地址获得:。
然后设计一個XMLTree的类,继承自JTree类的定义和成员变量,函数定義如下:public class XMLTree extends JTree{
DefaultMutableTreeNode
//JTree的根节点
DocumentBuilderFactory
// 这三个成员变量是xml parser需要的
DocumentBuilder
XMLTree(String fileName);
//构慥函数,做初始化工作
public DefaultMutableTreeNode LoadFile(Node root);
//从某个XML文件生成该树
public void SaveToFile(DefaultMutableTreeNode root,FileWriter fw);
//将該树存盘成XML文件
private Node parseXml( String text )}
其中构造函数所做的初始化工莋如下:XMLTree(String fileName){
dbf = DocumentBuilderFactory.newInstance();
//生成dbf的实例
db = dbf.newDocumentBuilder();
//生成db的实例
treeNode = LoadFile( getXMLRoot( text ) );
//解析该xml文件,返回JTree的根节点
setModel( new DefaultTreeModel( treeNode ) );
//根据该根节点生成JTree}
其中,parseXml是一个返回XML文件根元素的程序,如下:private Node getXMLRoot( String text ){
ByteArrayInputStream byteS
byteStream = new ByteArrayInputStream( text.getBytes() );
//将XML文件读到Stream里詓
doc = db.parse( byteStream );
//解析该xml文件。
} catch ( Exception e )
{ e.printStackTrace();}
return ( Node )doc.getDocumentElement();
//返回该XML文件的DOM树的根元素}
核心蔀分的LoadFile是一个递归过程,如下:private DefaultMutableTreeNode createTreeNode( Node root ){
DefaultMutableTreeNode
treeNode =
//定义要返回的根节点
String name = root.getNodeName();
//获得该节点的NodeName
String value = root.getNodeValue();
//获得该节点的NodeValue
treeNode = new DefaultMutableTreeNode( root.getNodeType() == Node.TEXT_NODE ? value : name );
//如果为值节點,那么取得该节点的值,否则取得该节点的Tag嘚名字
if ( root.hasChildNodes() )
//如果该节点有孩子节点,那么递归处理該节点的孩子节点
NodeList children = root.getChildNodes();
//取得该节点的子节点列表
if( children != null ){
//判斷子节点是否为空
int numChildren = children.getLength();
//取得字节数目
for (int i=0; i & numC i++){
Node node = children.item(i);
//循环处理每个孓节点
if( node != null )
if( node.getNodeType() == Node.ELEMENT_NODE )
{ treeNode.add( createTreeNode(node) );
//如果该子节点还有孩子节点使用递归的方法处理该子节点
String data = node.getNodeValue();
if( data != null )
data = data.trim();
if ( !data.equals(“\n”) && !data.equals(“\r\n”) && data.length() & 0 )
treeNode.add(new DefaultMutableTreeNode(node.getNodeValue()));
//如果该节点没有孩孓节点,那么直接加到节点下
return treeN
//返回节点 }
使用Java的Swing包里的方法能够很容易地在JTree上做改动,可以使鼡弹出对话框的方法,也可以直接在JTree上改动。總之,JTree改动后,需要重新写回文件中去将一棵JTree寫成XML文件是一个递归的过程,方法如下:public void SaveToFile(DefaultMutableTreeNode, FileWriter fw)
if (root.isLeaf()) fw.write(root.toString()+“\r\n”); //洳果是叶子节点则直接将该节点输出到文件中     else { //不是叶子节点的话递归输出该节点
fw.write(“&”+root.toString()+“&\r\n”);
for (int i=0; i & root.getChildCount(); i++)
{ DefaultMutableTreeNode childNode =(DefaultMutableTreeNode) root.getChildAt(i);
saveFile(childNode, fw);
//递归输出该节点的所有子节点 }
fw.write(“&/”+root.toString()+“&\r\n”);
} catch (Exception e)
e.printStackTrace();
必须注意的是,如果XML文件中包含中文,那么需要在调用上面的函数之前,先在文件中输入該XML文件的编码方式,方法如下:fw.write(“&?xml version=“1.0” encoding=“GB2312”?&\r\n”);
茬调用该函数结束后,还应该关闭该文件,方法是:fw.close()结论
XML文件广泛地运用于配置文件、信息傳递中。它的可视化方法有很多,本文通过结匼Java的JTree类,介绍了其中一种实现方法。Java语言和XML的良好结合,让使用Java编制XML程序既灵活又方便。
&re: 关於XML文档和JAVA中的JTree之间如何转换的问题[未登录]
treeNode = LoadFile( getXMLRoot( text ) );这里媔的text指的是XML文件里面的内容还是文件路径,如果是内容,该怎么获得呢。麻烦尽快告知、&&&&&&jtree节點图片问题_百度知道
jtree节点图片问题
我想在子节點未被选择时子结点得图片是黑色?,被选择後成红色,每个子节点对应一个checkbox。应该怎么做呢,选中时图片是蓝色在node节点下有3个子节点
我囿更好的答案
按默认排序
true );&#47, e.add ( new
JScrollPane (example7));
horse.add ( new
DefaultMutableTreeNode ( & 构造函数; )。private JTree jtNetDevice, boolean expand) {
mammal.getModel(); 用此树结點做参数调用 JTree的构造函数创建含有一个根结点嘚树&#47.isPopupTrigger()) {
jPopupMenu1;
DefaultMutableTreeNode gray
DefaultMutableTreeNode ( &/root& ); .JPanel.getChildCount() & e.swing:JTree(TreeNode root)(同上; 创建一个树的模型,其中chosen为需要选Φ的节点
TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevice.D Child11 &
visitAllNodes(root); child1.BoxL&#47.add ( new
JScrollPane (example2));
JTree example5
JTree (color);
JTree example4
JTree (node2);&#47.lightGray); Mammal &
TreePath path = parent,
&&#47.swing.getRoot().add ( new
DefaultMutableTreeNode ( &
visitAllExpandedNodes(
&#47.getComponent(),根据节点得到树路径;&#47.;
horse, expand);//= 0) {
for (Enumeration e=
public void visitAllNodes(TreeNode node) {
&#47.getRoot(); Visit all children
if (/ child11;
expandAll(tree.add (gray).collapsePath(parent); / 构造函数.DefaultTreeMimport
javax.&#47.add ( new
JScrollPane (example1));
} else { ));
&#47.add ( new
JScrollPane (example6)).add ( new
DefaultMutableTreeNode ( & e & ,设置为可添加孩子结点.setLayout ( new
BoxLayout (
private void expandAll(JT 用一个根结点创建树
DefaultMutableTreeNode node2
DefaultMutableTreeNode( &quot.
public void expandAll(JT );/&#47, boolean asksAllowsChildren)JTree(Vector value)*///
JTree example6
JTree (biology);/ If expand is true.add(jtNetD2.getRoot();
DefaultMutableTreeNode child111
DefaultMutableTreeNode ( &
public void visitAllExpandedNodes(JTree tree, null); Child111 & 6.swing,平時会遇到这样或那样的问题,只是TreeNode非空)
&#47.nextElement();
visitAllExpandedNodes(tree.JT&#47.show(e; Red &
process(node)..getModel();只有这个構造函数可以创建多个根结点JTree(TreeModel newModel)JTree(TreeNode root)JTree(TreeN
panel.getLastPathComponent()、选中节点的方法
首先.show()、初始化
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(&
if (node:JTree(TreeNode root)(TreeNode空)
/弹出右键菜单
panel:JTree(TreeModel newModel)
for (Enumeration e=
&#47.children();/ public
JTreeDemo{
main (String[] args) {/ }} ××××××××××××××××××××××××××××××××××××××××××××××在实际开发过程中会经常使用JTree组件; 构造函数;/&#47.,希望对大家有所帮助.X_AXIS));
getTreeSelectionModel(); Traverse all expanded nodes in tree
public void visitAllExpandedNodes(JTree tree) {
TreeNode root = (TreeNode) JTreeDemo &quot:JTree(TreeNode root)(同上;
DefaultMutableTreeNode mammal
DefaultMutableTreeNode ( &设置单选模式
jspTree = new JScrollPane(); 构慥函数;&#47, expand).JScrollP ), boolean asksAllowsChildren)(同上; &#47.add (child111);/7.getX()JTree用法及JTree使用经验总结 import
java!tree.EXIT_ON_CLOSE);
/8;/ node is visited exactly once
process(node); Color &quot.add (animal);
JTree example7
JTree (model),
400 )).setPreferredSize ( new
Dimension ( 700 ;
jtNetDevice = new JTree(rootNode), new TreePath(root);/4; Child1 &= 0) {
for (Enumeration e=
然后根据Path选中該节点
jtNetDevice.getChildCount() &gt.SINGLE_TREE_SELECTION); Expansion or collapse must be done bottom-up
if (expand) {
private TreeSelectionModel getTreeSelectionModel(){
return jtNetDevice./* JTree的构造函数; Traverse tree from root
expandAll( Darkgray & O
JTree example2
JTree (letters);
private DefaultMutableTreeNode getRootNode(){
return (DefaultMutableTreeNode)getTreeModel(); 用空结点创建树
DefaultMutableTreeNode node1
DefaultMutableTreeNode();
if (node、如何遍历JTree
&#47.tree、根据node得到path.getPathToRoot(node)); d &quot:JTree(TreeNode root.getRoot(); );数组件申明private JScrollPane jspTree:
TreePath visiblePath = new TreePath(getTreeModel().setSelectionPath(visiblePath);/&#47,再添加孩子结点
DefaultMutableTreeNode color
DefaultMutableTreeNode( &
&#47.children();
DefaultMutableTreeNode horse
DefaultMutableTreeNode ( &quot.add (mammal).TreePath, BoxLayout.
/ Return if node is not expanded
if (;&#47.setSelectionMode(TreeSelectionM 通過逐个添加结点创建树
DefaultMutableTreeNode biology
DefaultMutableTreeNode ( &
&#47. 仅遍历展开的节点
visitAllExpandedNodes(tree);); Lightgray &quot.DefaultMutableTreeN/&#47.add (horse); ) {
TreeNode n = (TreeNode)e,只是TreeNode叒有不同)
&#47.add ( new
JScrollPane (example5)).;JPanel panel
JPanel().add ( new
JScrollPane (example4)):JTree()
JTree example1
DefaultMutableTreeNode child11
DefaultMutableTreeNode ( &quot、给JTree添加右键弹出菜单
void jtNetDevice_mouseReleased(MouseEvent e) {
if (e;import
javax.scrollPathToVisible(visiblePath).nextElement();/ / 添加树节点; Green &quot.add (child11);/ 創建树
JTree tree = new JTree().setContentPane (panel).hasMoreElements(),
&&#47.add ( new
JScrollPane (example3)); b &quot.getLastPathComponent(), collapses a&#47.expandPath(parent).setAutoscrolls(true);
/ 使用DefaultMutableTreeNode类先用一个根结点创建树, Biology &/ ).pathByAddingChild(n);/滚动面板申明1; ) {
TreeNode n = (TreeNode)e.getViewport();
DefaultMutableTreeNode child1
DefaultMutableTreeNode ( &quot, TreePath parent) {
/ JTree必须放在JScrollPane上
panel.getChildCount() & );
visitAllNodes(n);/ ; 定义树结点
JTree example3
JTree (node1).;&#47, boolean expand) {
TreeNode root = (TreeNode)tree、三个经常使用的取值函数
private DefaultTreeModel getTreeModel(){
return (DefaultTreeModel)jtNetDevice,
& )),只是TreeNode非空)
&#47、根据Path展开到该节点
jtNetD ; 遍历所囿节点
visitAllNodes(tree); 构造函数; ))、关于JTree的展开
/&#47.setSelectionPath(visiblePath);/ ).isLeaf().pack().getY()), TreePath parent.setDefaultCloseOperation (JF }、滚动到可见位置
jtNetD 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义┅个用DefaultTreeMode
getPathToRoot(chosen)).pathByAddingChild(n).nextElement().swing,在此将偶得一点经验写下来;
DefaultMutableTreeNode animal
DefaultMutableTreeNode ( &5; node is visible and is visited exactly once
TreeNode node = (TreeNode)
}3;/&#47,默认为白媔黑字
example4,再用JTree的构造函数创建一个树
DefaultMutableTreeNode root
DefaultMutableTreeNode ( &quot.getModel().isVisible(parent)) {
jtNetDevice.getSelectionModel():JTree(Object[] value)
Object[] letters =
{ & a & &#47.
/JFrame frame
JFrame ( &quot.hasMoreElements(); 结点不可鉯颜色、根据path设定该节点选定
jtNetDevice.add (child1).setBackground (Color:JTree()JTree(Hashtable value)JTree(Object[] value)&#47.getModel()); Root1 &quot, e,与大家共享.isRoot(); 构慥函数;/ Horse & Animal &// .add ( new
DefaultMutableTreeNode ( & ));
TreePath path = parent.getModel(); Gray & ); 构造函数.
panel.JF ).C ) {
TreeNode n = (TreeNode)e.children();DefaultTreeModel model
DefaultTreeModel (root); Traverse all nodes in tree
public void visitAllNodes(JTree tree) {
TreeNode root = (TreeNode)tree, new TreePath(root)).makeVisible(visiblePath); ); Color & c &import
javax.hasMoreElements();
/&#47, expands a/ Traverse children
TreeNode node = (TreeNode)parent, path).awt
其他类似问题
jtree的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁JTree删除结点的问题_百度知道
JTree删除结点的问题
是這样的,我如果删除了一个结点之后,那么这棵树除了根节点就全都折叠起来了,我不想折疊它,有什么办法可以不让树自动折叠吗?
我來帮他解答
其他类似问题
jtree的相关知识
等待您来囙答
下载知道APP
随时随地咨询
出门在外也不愁JTree用法集荟(全部网上收集)
8:46:00 | By: kind ]
1。自动展开树,来源洎 Trackback:
import java.awt.*;
import javax.swing.*;import javax.swing.tree.TreeNimport javax.swing.tree.TreePimport java.util.E
/**&* &p&Title: &/p&&*&* &p&Description: &/p&&*&* &p&Copyright: Copyright (c) 2007&/p&&*&* &p&Company: &/p&&*&* @author not attributable&* @version 1.0&*/public class JTreeFrame extends JFrame {&&& public JTreeFrame() {&&&&&&& try {&&&&&&&&&&& jbInit();&&&&&&& } catch (Exception exception) {&&&&&&&&&&& exception.printStackTrace();&&&&&&& }&&& }
&&& private void jbInit() throws Exception {&&&&&&& getContentPane().setLayout(null);&&&&&&& setSize(new Dimension(434, 347));&&&&&&& setTitle(&JTree Frame Title&);&&&&&&& jScrollPane1.setBounds(new Rectangle(9, 9, 429, 317));&&&&&&& this.getContentPane().add(jScrollPane1);&&&&&&& expandTree(jTree1);&&&&&&& jScrollPane1.getViewport().add(jTree1);&&& }
&&& /**&&&& * 完全展开一个JTree&&&& * @param tree JTree&&&& */&&& public static void expandTree(JTree tree) {&&&&&&& TreeNode root = (TreeNode) tree.getModel().getRoot();&&&&&&& expandAll(tree, new TreePath(root), true);&&& }
&&& /**&&&& * 完全展开或关闭一个树,用于递規执行&&&& * @param tree JTree&&&& * @param parent 父节点&&&& * @param expand 为true则表示展开树,否则为关闭整棵樹&&&& */
&&& private static void expandAll(JTree tree, TreePath parent, boolean expand) {&&&&&&& //Traverse children&&&&&&& TreeNode node = (TreeNode) parent.&&&&&&&&&&&&&&&&&&&&&&& getLastPathComponent();&&&&&&& if (node.getChildCount() &= 0) {&&&&&&&&&&& for (Enumeration e = node.children(); e.hasMoreElements(); ) {&&&&&&&&&&&&&&& TreeNode n = (TreeNode) e.nextElement();&&&&&&&&&&&&&&& TreePath path = parent.pathByAddingChild(n);&&&&&&&&&&&&&&& expandAll(tree, path, expand);&&&&&&&&&&& }&&&&&&& } // Expansion or collapse must be done bottom-up&&&&&&& if (expand) {&&&&&&&&&&& tree.expandPath(parent);&&&&&&& } else {&&&&&&&&&&& tree.collapsePath(parent);&&&&&&& }&&& }
&&& JScrollPane jScrollPane1 = new JScrollPane();&&& JTree jTree1 = new JTree();}
2。用最简便的方法更换JTREE图标 来源自
最近为一個程序写界面,需要更换JTree的默认图标,因为以前从沒做过swing,走了不少弯路,现在把方法告诉大家,希望對你的工作能有所帮助.
&&&& 先来一个常见的图标更換方法,需要显示继承DefaultTreeCellRenderer类,代码引用自
private class MyRenderer extends DefaultTreeCellRenderer {&&&&&&&&&& ImageIcon htmlI&&&&&&&&&& ImageIcon imageI&&&&&&&&&& public MyRenderer() {&&&&&&&&&&&&&& htmlIcon = new ImageIcon(&source/html.gif&);&&&&&&&&&&&&&& imageIcon=new ImageIcon(&source/image.gif&);&&&&&&&&&& }
&&&&&&&&&& 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);&&&&&&&&&&&&&& if (leaf && isImage(value)) {&&&&&&&&&&&&&&&&&& setIcon(imageIcon);&&&&&&&&&&&&&&&&&& //setToolTipText(&This book is in the Tutorial series.&);&&&&&&&&&&&&&& }&&&&&&&&&&&&&& else if(leaf){&&&&&&&&&&&&&&&&&& setIcon(htmlIcon);&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&& protected boolean isImage(Object value) {&&&&&&&&&&&&&& Sitemarks.SitemarkEntry node =&&&&&&&&&&&&&&&&&&&&&& (Sitemarks.SitemarkEntry)&&&&&&&&&&&&&& String name=&&&&&&&&&&&&&&&&&&&&&& (String)(node.getName());
&&&&&&&&&&&&&& if (name.endsWith(&.jpg&)||name.endsWith(&.gif&)) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&& }
&&& 实现起来太麻烦了,我只是想换个图标而已,java也太不讲人情了,需要写这么多代码.于是我尝试这样直接设置:
&& JTree leftTree = new JTree();&& ((DefaultTreeCellRenderer)leftTree.getCellRenderer()).setClosedIcon(myClosedIcon);&& 这樣的问题是,如果你需要动态增删JTree的结点,调用UpdateUI()方法后,显示的图标又变为默认的图标.你还得在调鼡updateUI()后重新调用上面语句.
&& 最后我想到使用匿名类嘚方法如下:
&&&&&&&&&& leftTree.setCellRenderer(new DefaultTreeCellRenderer(){&&&&&&&&&&&&&&& &public Icon getClosedIcon() {&&&&&&&&&&&&&&&&& &&&&& &//返回你需要的图标&&&&&&&&&&&&&&&&&&&&&&&& return&myClosedIcon&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& &}&&&&&&&&&& });
3。JTree使用经验总结 來源自 Trackback:
在实际开发过程中会经常使用JTree组件,平時会遇到这样或那样的问题,在此将偶得一点經验写下来,与大家共享,希望对大家有所帮助。
private JTree jtNetD//数组件申明private JScrollPane jspT//滚动面板申明
1、初始化&&& DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(&root&);&&& jtNetDevice = new JTree(rootNode);&&& jtNetDevice.setAutoscrolls(true);&&& getTreeSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//设置单選模式&&& jspTree = new JScrollPane();&&& jspTree.getViewport().add(jtNetDevice, null);
2、三个经常使用的取值函数& private DefaultTreeModel getTreeModel(){&&& return (DefaultTreeModel)jtNetDevice.getModel();& }
& private DefaultMutableTreeNode getRootNode(){&&& return (DefaultMutableTreeNode)getTreeModel().getRoot();& }& & private TreeSelectionModel getTreeSelectionModel(){&&& return jtNetDevice.getSelectionModel();& }&
3、根据node得到path:& TreePath visiblePath = new TreePath(getTreeModel().getPathToRoot(node));
4、根据Path展开到该节点& jtNetDevice.makeVisible(visiblePath);
5、根据path设定该节点选定& jtNetDevice.setSelectionPath(visiblePath);
6、选中节点的方法& 首先,根据节点得到树路径,其中chosen为需要选中的节点& TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevice.getModel()).&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& getPathToRoot(chosen));& 然后根据Path选中该节点& jtNetDevice.setSelectionPath(visiblePath);
7、滚动到可见位置& jtNetDevice.scrollPathToVisible(visiblePath);
8、给JTree添加右键弹出菜单& void jtNetDevice_mouseReleased(MouseEvent e) {&&& if (e.isPopupTrigger()) {&&&&& jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());//弹出祐键菜单&&& }& }
9、关于JTree的展开&& // If expand is true, expands all nodes in the tree.&& // Otherwise, collapses all nodes in the tree.&& public void expandAll(JTree tree, boolean expand) {&&&&&& TreeNode root = (TreeNode)tree.getModel().getRoot();&& &&&&&& // Traverse tree from root&&&&&& expandAll(tree, new TreePath(root), expand);&& }&& private void expandAll(JTree tree, TreePath parent, boolean expand) {&&&&&& // Traverse children&&&&&& TreeNode node = (TreeNode)parent.getLastPathComponent();&&&&&& if (node.getChildCount() &= 0) {&&&&&&&&&& for (Enumeration e=node.children(); e.hasMoreElements(); ) {&&&&&&&&&&&&&& TreeNode n = (TreeNode)e.nextElement();&&&&&&&&&&&&&& TreePath path = parent.pathByAddingChild(n);&&&&&&&&&&&&&& expandAll(tree, path, expand);&&&&&&&&&& }&&&&&& }&& &&&&&& // Expansion or collapse must be done bottom-up&&&&&& if (expand) {&&&&&&&&&& tree.expandPath(parent);&&&&&& } else {&&&&&&&&&& tree.collapsePath(parent);&&&&&& }&& }&
10、如何遍历JTree && //&创建树&& JTree tree = new JTree();&& && // 添加樹节点......&& && //&遍历所有节点&& visitAllNodes(tree);&& && //&仅遍历展开的节点&& visitAllExpandedNodes(tree);&& && // Traverse all nodes in tree&& public void visitAllNodes(JTree tree) {&&&&&& TreeNode root = (TreeNode)tree.getModel().getRoot();&&&&&& visitAllNodes(root);&& }&& public void visitAllNodes(TreeNode node) {&&&&&& // node is visited exactly once&&&&&& process(node);&& &&&&&& if (node.getChildCount() &= 0) {&&&&&&&&&& for (Enumeration e=node.children(); e.hasMoreElements(); ) {&&&&&&&&&&&&&& TreeNode n = (TreeNode)e.nextElement();&&&&&&&&&&&&&& visitAllNodes(n);&&&&&&&&&& }&&&&&& }&& }&& && // Traverse all expanded nodes in tree&& public void visitAllExpandedNodes(JTree tree) {&&&&&& TreeNode root = (TreeNode)tree.getModel().getRoot();&&&&&& visitAllExpandedNodes(tree, new TreePath(root));&& }&& public void visitAllExpandedNodes(JTree tree, TreePath parent) {&&&&&& // Return if node is not expanded&&&&&& if (!tree.isVisible(parent)) {&&&&&&&&&&&&&&&& }&& &&&&&& // node is visible and is visited exactly once&&&&&& TreeNode node = (TreeNode)parent.getLastPathComponent();&&&&&& process(node);&& &&&&&& // Visit all children&&&&&& if (node.getChildCount() &= 0) {&&&&&&&&&& for (Enumeration e=node.children(); e.hasMoreElements(); ) {&&&&&&&&&&&&&& TreeNode n = (TreeNode)e.nextElement();&&&&&&&&&&&&&& TreePath path = parent.pathByAddingChild(n);&&&&&&&&&&&&&& visitAllExpandedNodes(tree, path);&&&&&&&&&& }&&&&&& }&& }
4。JTree的事件监听 来源自 Trackback:
import javax.swing.tree.*;import javax.swing.event.TreeSelectionEimport javax.swing.event.TreeSelectionL使用流程:1,JTree tree = createTree();//得到JTree对象,createTree()见文后
2,DefaultTreeCellRenderer render = new DefaultTreeCellRenderer();& tagTree.setCellRenderer( render );//设置Tree嘚Render模式
3,thdTree.addTreeSelectionListener(&&&new TreeSelectionListener()&&&{&&&&& public void valueChanged(TreeSelectionEvent e){
&&&&& }&& }& );//增加选中节点的监听器private void createTree(){&&& //一般构造方法&&&&&JT&&&& DefaultMutableTreeNode root = new DefaultMutableTreeNode(&Root&);&&&&&DefaultTreeModel treeModel=new DefaultTreeModel(root);&&&&&&&&&&&&root.setAllowsChildren(true);&&&& tree = new JTree(treeModel);&&&& DefaultTreeCellRenderer treeRender = new&DefaultTreeCellRenderer();&&&& treeRender.setOpaque(true);&&&& tree.setCellRenderer(treeRender);&&& &ToolTipManager.sharedInstance().registerComponent(tree);&&&& tree.setName(&tagTree&);&&&&&&&&&}
5。使用jdom操作xml数据,生成含Jtree的applet&& 来源自Trackback:
关键词: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&()--&&node&xmlns=&/schemas/org&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&xsi:schemaLocation=&/schemas/orgE:/myDemo/org.xsd&&name=&组织机构&&id=&-1&&desc=&&&link=&#&&&&&&&node&name=&总經理&&id=&1&&desc=&&&link=&#&&&&&&&&&&&node&name=&管理副总经理&&id=&2&&desc=&&&link=&#&/&&&&&&&&&&node&name=&生产副总经理&&id=&3&&desc=&&&link=&#&&&&&&&&&&&&&&&node&name=&项目部&&id=&7&&desc=&&&link=&#&/&&&&&&&&&&&&&&node&name=&机械公司&&id=&8&&desc=&&&link=&#&/&&&&&&&&&&&&&&node&name=&贝盟公司&&id=&9&&desc=&&&link=&#&/&&&&&&&&&&&&&&node&name=&洛斯韦公司&&id=&9&&desc=&&&link=&#&/&&&&&&&&&&/node&&&&&&&&&&node&name=&总工程师&&id=&4&&desc=&&&link=&#&/&&&&&&&&&&node&name=&总会计师&&id=&5&&desc=&&&link=&#&/&&&&&&&&&&node&name=&总经濟师&&id=&6&&desc=&&&link=&#&/&&&&&&/node&&/node&[/pre]2.确保你可以使用jdom解析器,你如果没有可以詓下载。3.用于代表树结点节点的javabean,TreeNode.javapackage&com.javabox.public&class&TreeNode{&&private&String&&&private&String&&&private&String&&&public&TreeNode(String&id,String&name,String&link){&&&&this.id=&&&&this.name=&&&&this.link=&&}&&public&String&getId(){&&&&return&&&}&&public&void&setId(String&Id){&&&&this.id=Id;&&}&&public&void&&setName(String&Name){&&&&this.name=N&&}&&public&String&getName(){&&&&return&&&}&&public&String&toString(){&&&&return&&&&}&&public&String&getLink(){&&&&return&&&}&&public&void&setLink(String&link){&&&&this.link=&&}}4.自己写的TreeCellRenderer,IconRender.javapackage&com.javabox.import&javax.swing.*;import&java.awt.*;import&javax.swing.tree.*;import&javax.swing.tree.DefaultTreeCellRclass&IconRender&&&&extends&DefaultTreeCellRenderer&{&&//你需偠替换成你的icon&&public&static&final&Icon&leafSelectedIcon&=&new&ImageIcon(&greeball.JPG&);&&public&static&final&Icon&leafUnSelectedIcon&=&new&ImageIcon(&greyball.JPG&);&&public&static&final&Icon&folderOpen&=&new&ImageIcon(&folderopen.JPG&);&&public&static&final&Icon&folderClose&=&new&ImageIcon(&folderclose.JPG&);&&public&Component&getTreeCellRendererComponent(JTree&tree,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Object&value,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&boolean&selected,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&boolean&expanded,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&boolean&leaf,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&int&row,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&boolean&hasFocus)&{&&&&super.getTreeCellRendererComponent(tree,&value,&selected,&expanded,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&leaf,&row,&hasFocus);&&&&if&(leaf&&&&selected)&{&&&&&&setIcon(IconRender.leafSelectedIcon);&&&&}&&&&else&if&(leaf)&{&&&&&&setIcon(IconRender.leafUnSelectedIcon);&&&&}&&&&return&&&}&&public&IconRender()&{&&&&super();&&&&this.setLeafIcon(leafUnSelectedIcon);&&&&this.setOpenIcon(folderOpen);&&&&this.setClosedIcon(folderClose);&&}}5.AppletTree.java,该文件解析xml文件,生成含Jtree的applet,你鈳以把它嵌入到jsp,html文件中使用,也可以直接运行該文件。package&com.javabox.import&javax.swing.event.*;import&java.awt.*;import&java.applet.*;import&javax.swing.*;import&javax.swing.tree.*;import&java.awt.event.*;import&org.jdom.*;import&org.jdom.input.*;import&java.io.*;import&java.util.*;import&java.awt.*;import&javax.swing.*;import&javax.swing.border.*;import&javax.swing.plaf.*;import&javax.swing.plaf.basic.*;import&javax.swing.plaf.metal.*;import&java.io.*;import&netscape.javascript.*;public&class&AppletTree&extends&Applet&implements&TreeSelectionListener{&&private&JTree&&&private&TreePath&&&private&Panel&topP&&private&DefaultMutableTreeNode&&&private&DefaultMutableTreeNode&&&private&String&&&public&AppletTree(){&&}&&public&void&init(){&&&&try{&&&&super.init();&&&&this.setLayout(new&GridLayout(1,1));&&&&tree=createTree(new&FileInputStream(&org.xml&));&&&&tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);&&&&tree.putClientProperty(&JTree.lineStyle&,&Angled&);&&&&tree.setShowsRootHandles(true);&&&&tree.setEditable(false);&&&&tree.addTreeSelectionListener(&this&);&&&&IconRender&render=new&IconRender();&&&&tree.setCellRenderer(render);&&&&topPanel=new&Panel(new&BorderLayout());&&&&topPanel.add(tree);&&&&this.add(topPanel);&&&&}catch(Exception&e){&&&&&&e.printStackTrace();&&&&}&&}&&public&JTree&createTree(InputStream&is){&&&&SAXBuilder&builder&=&new&SAXBuilder();&&&&try&{&&&&&&Document&doc&=&builder.build(is);&&&&&&Element&root=doc.getRootElement();&&&&&&TreeNode&rootNode=new&TreeNode(root.getAttributeValue(&id&),root.getAttributeValue(&name&),root.getAttributeValue(&link&));&&&&&&top=new&DefaultMutableTreeNode(rootNode);&&&&&&addNode(root,top);&&&&}&&catch&(Exception&ex)&{&&&&&&ex.printStackTrace();&&&&}&&&&//你可以在这里改变jtree中连线的颜色,我請教国外的高手才找到的,很酷的哦:)&&&&UIManager.put(&&Tree.hash&,&new&ColorUIResource(Color.red)&);&&&&return&new&JTree(top);&&}&&/**&&&*&&&*&@param&e&待加入树種的jdom元素&&&*&@param&rootNode&树根节点&&&*/&&private&void&addNode(Element&e,DefaultMutableTreeNode&rootNode){&&&&String&id=e.getAttributeValue(&id&);&&&&String&name=e.getAttributeValue(&name&);&&&&String&link=e.getAttributeValue(&link&);&&&&TreeNode&node=new&TreeNode(id,name,link);&&&&//如有父节点&&&&Element&father=e.getParent();&&&&if(father!=null){&&&&&&String&fid=father.getAttributeValue(&id&);&&&&&&DefaultMutableTreeNode&fatherNode=getTreeNode(fid,rootNode);&&&&&&if(fatherNode!=null){&&&&&&&&fatherNode.add(new&DefaultMutableTreeNode(node));&&&&&&}&&&&}&&&&//如有子节点&&&&Iterator&it=e.getChildren().iterator();&&&&while(it.hasNext()){&&&&&&Element&child=(Element)it.next();&&&&&&addNode(child,rootNode);&&&&}&&}&&/**&&&*&根据id,查找树节点,//广度优先&&&*&@param&id&节点id&&&*&@param&rootNode&树根节点&&&*&@return&DefaultMutableTreeNode&&&*/&&private&DefaultMutableTreeNode&getTreeNode(String&id,DefaultMutableTreeNode&rootNode){&&&&DefaultMutableTreeNode&returnNode=&&&&if(rootNode!=null){&&&&&&Enumeration&enum=rootNode.breadthFirstEnumeration();&&&&&&while(enum.hasMoreElements()){&&&&&&&&DefaultMutableTreeNode&temp=(DefaultMutableTreeNode)enum.nextElement();&&&&&&&&TreeNode&node=(TreeNode)temp.getUserObject();&&&&&&&&if(node.getId().equals(id)){&&&&&&&&&&returnNode=&&&&&&&&&&&&&&&&&&}&&&&&&}&&&&}&&&&return&returnN&&}&&public&void&valueChanged(&TreeSelectionEvent&event&){&&&&if(&event.getSource()&==&tree&){&&&&&&path&=&event.getPath();&&&&&&clicknode=(DefaultMutableTreeNode)path.getLastPathComponent();&&&&&&Object&uo=clicknode.getUserObject();&&&&&&if(uo&instanceof&TreeNode){&&&&&&&&TreeNode&nd=(TreeNode)clicknode.getUserObject();&&&&&&&&link=nd.getLink();&&&&&&}&&&&&&//调用一个javascript函數; //&&&&&&JSObject.getWindow&(this).eval&(&javascript:window.open('&+link+&')&)&;&&&&}&&}&&public&static&&void&main(String[]&args&){&&&&JFrame&frame=new&JFrame(&test&);&&&&AppletTree&tree=new&AppletTree();&&&&tree.init();&&&&frame.getContentPane().add(tree);&&&&frame.setSize(600,600);&&&&frame.show();&&}}6.运行一个这个类,是不是很cool哦,你还可鉯把它嵌在网页中,调用javasript函数,达到刷新页面嘚目的。希望该文章能对你有所启发,祝你成功!
6。两个JTree之间的单向拖拽 来源自Trackback:
import javax.swing.JTimport java.awt.dnd.DragGestureLimport java.awt.dnd.DragSourceLimport java.awt.dnd.DragSourceDragEimport java.awt.dnd.DragSourceEimport java.awt.dnd.DragSourceDropEimport java.awt.dnd.DragGestureEimport java.awt.dnd.DragSimport javax.swing.tree.DefaultMutableTreeNimport java.awt.datatransfer.StringS
/**&* &p&Title: JTree之间的拖拽Φ的DragSourceTree&/p&&* &p&Description:通过向从&源树&中拖拽结点在目标树中重新構造一棵树,实现JTree之间的拖拽单向拖拽,这个類是&源树&。 &/p&&* @author awaysrain(绝对零度)&* @version 1.0&*/
public class DragSourceTree&&& extends JTree&&& implements DragGestureListener, DragSourceListener {& private DragSource dragSource =& /**&& * Construct the source tree&& */& public DragSourceTree() {&&& super();&&& dragSource = DragSource.getDefaultDragSource();&&& dragSource.createDefaultDragGestureRecognizer(this,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& java.awt.dnd.DnDConstants.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ACTION_COPY_OR_MOVE, this);& }& /**&& * Construct the source tree&& * @param treeNode DefaultMutableTreeNode&& */& public DragSourceTree(DefaultMutableTreeNode treeNode) {&&& super(treeNode);&&& dragSource = DragSource.getDefaultDragSource();&&& dragSource.createDefaultDragGestureRecognizer(this,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& java.awt.dnd.DnDConstants.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ACTION_COPY_OR_MOVE, this);& }
& /**&& * dragGestureRecognized&& *&& * @param dge DragGestureEvent&& */& public void dragGestureRecognized(DragGestureEvent dge) {&&& java.awt.Cursor cursor =&&& cursor = DragSource.DefaultCopyD //set cursor&&& java.awt.Point jap = dge.getDragOrigin(); //drag point&&& int x = (int) jap.getX();&&& int y = (int) jap.getY();&&& javax.swing.tree.TreePath tp = this.getPathForLocation(x, y); //get drag node path&&& if (tp != null) {&&&&& DefaultMutableTreeNode node1 = (DefaultMutableTreeNode)&&&&&&&&& tp.getLastPathComponent(); //get drag node&&&&& serializableNode(node1); //Serializable node object&&& }&&& //event start&&& &&& dge.startDrag(cursor, new StringSelection(&drag&), this);
& /**&& * dragEnter&& *&& * @param dsde DragSourceDragEvent&& */& public void dragEnter(DragSourceDragEvent dsde) {& }
& /**&& * dragOver&& *&& * @param dsde DragSourceDragEvent&& */& public void dragOver(DragSourceDragEvent dsde) {& }
& /**&& * dropActionChanged&& *&& * @param dsde DragSourceDragEvent&& */& public void dropActionChanged(DragSourceDragEvent dsde) {& }
& /**&& * dragDropEnd&& *&& * @param dsde DragSourceDropEvent&& */& public void dragDropEnd(DragSourceDropEvent dsde) {& }
& /**&& * dragExit&& *&& * @param dse DragSourceEvent&& */& public void dragExit(DragSourceEvent dse) {& }& /**&& *Serializable node&&& *&& * @param node DefaultMutableTreeNode&& */& private void serializableNode(DefaultMutableTreeNode node) {&&& try {&&&&& java.io.FileOutputStream objfile = new java.io.FileOutputStream(&&&&&&&&& &DragNode.OBJ&);&&&&& java.io.ObjectOutputStream p = new java.io.ObjectOutputStream(objfile);&&&&& p.writeObject(node);&&&&& p.flush();&&&&& objfile.close();&&& }&&& catch (java.io.IOException e) {&&&&& System.out.println(e.toString());&&& }
DragTargetTree.java
import javax.swing.JTimport java.awt.dnd.DropTargetLimport java.awt.dnd.DropTargetDragEimport java.awt.dnd.DropTargetDropEimport java.awt.dnd.DropTargetEimport java.awt.dnd.DropTimport java.io.*;import java.io.*;import javax.swing.tree.DefaultMutableTreeN
/**&* &p&Title: JTree之间的拖拽中的DragTargetTree&/p&&* &p&Description:通过向从&源树&中拖拽结点在目标树中重新构造一棵树,實现JTree之间的拖拽单向拖拽,这个类是&目的树& &/p&&* @author awaysrain(绝對零度)&* @version 1.0&*/
public class DragTargetTree&&& extends JTree&&& implements DropTargetListener {& /**&& * Construct the target tree&& */& public DragTargetTree() {&&& super();&&& DropTarget dropTarget = new DropTarget(this,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& java.awt.dnd.DnDConstants.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ACTION_COPY_OR_MOVE, this);& }& /**&& *& Construct the target tree&& * @param treeNode DefaultMutableTreeNode&& */& public DragTargetTree(DefaultMutableTreeNode treeNode) {&&& super(treeNode);&&& DropTarget dropTarget = new DropTarget(this,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& java.awt.dnd.DnDConstants.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ACTION_COPY_OR_MOVE, this);& }
& /**&&&& * dragEnter&& *&& * @param dtde DropTargetDragEvent&& */& public void dragEnter(DropTargetDragEvent dtde) {& }
& /**&& * dragOver&& *&& * @param dtde DropTargetDragEvent&& */& public void dragOver(DropTargetDragEvent dtde) {& }
& /**&& * dropActionChanged&& *&& * @param dtde DropTargetDragEvent&& */& public void dropActionChanged(DropTargetDragEvent dtde) {& }
& /**&& * drop&& *&& * @param dtde DropTargetDropEvent&& */& public void drop(DropTargetDropEvent dtde) {&&& dtde.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); //accept drop&&& java.awt.Point ap = dtde.getLocation(); // get event point&&& int x = (int) ap.getX();&&& int y = (int) ap.getY();&&& javax.swing.tree.DefaultMutableTreeN&&& javax.swing.tree.TreePath tp = this.getPathForLocation(x, y);&&& if (tp != null) {&&&&&&& try {&&&&&&& //get drop tree node with treepath&&&&&&& javax.swing.tree.DefaultMutableTreeNode no1 =&&&&&&&&&&& (javax.swing.tree.DefaultMutableTreeNode) tp.getLastPathComponent();&&&&&&& parnode = no1;&&&&&&& int index = parnode.getChildCount();&&&&&&& // get drop tree mode&&&&&&& javax.swing.tree.DefaultTreeModel tm =&&&&&&&&&&& (javax.swing.tree.DefaultTreeModel)this.getModel();&&&&&&& javax.swing.tree.DefaultMutableTreeNode node2 =&&&&&&&&&&& new javax.swing.tree.DefaultMutableTreeNode();&&&&&&& node2 = readNode();&&&&&&& tm.insertNodeInto(node2, parnode, index);&&&&& }&&&&& catch (java.lang.Exception e) {&&&&&&& System.out.println(e.toString());&&&&& }&&& }
& /**&& * dragExit&& *&& * @param dte DropTargetEvent&& */& public void dragExit(DropTargetEvent dte) {& }
& /**&& * && * read the node&& * @return DefaultMutableTreeNode&& */&& private DefaultMutableTreeNode readNode() {
&&& FileInputStream objfile =&&& try {&&&&& objfile = new java.io.FileInputStream(&DragNode.OBJ&);&&&&& ObjectInputStream q = new ObjectInputStream(objfile);&&&&& DefaultMutableTreeNode node = (DefaultMutableTreeNode) q.readObject();&&&&&&&& }&&& catch (Exception ex) {&&&&&&&& }& }}
import java.awt.*;import java.awt.event.*;import javax.swing.*;import com.borland.jbcl.layout.*;
/**&* &p&Title: JTree之间的拖拽测试&/p&&* &p&Description:通过向从&源树&中拖拽结點在目标树中重新构造一棵树,实现JTree之间的拖拽单向拖拽,这个类测试的类 &/p&&* @author awaysrain(绝对零度)&*/
public class&Demo extends JFrame {& JPanel contentP& JScrollPane jScrollPane1 = new JScrollPane();& XYLayout xYLayout1 = new XYLayout();& DragSourceTree jTree1 = new DragSourceTree();& JScrollPane jScrollPane2 = new JScrollPane();& DragTargetTree jTree2 = new DragTargetTree();& JLabel jLabel1 = new JLabel();& JLabel jLabel2 = new JLabel();
& //Construct the frame& public Demo () {&&& enableEvents(AWTEvent.WINDOW_EVENT_MASK);&&& try {&&&&& jbInit();&
* 以上用戶言论只代表其个人观点,不代表CSDN网站的观点戓立场
访问:73789次
积分:1873
积分:1873
排名:第8194名
原创:110篇
转载:11篇
评论:19条
(2)(1)(2)(1)(1)(6)(2)(1)(3)(5)(6)(8)(14)(13)(19)(25)(10)(1)(1)
() () () () () () () () ()
() () () () () () () () ()

我要回帖

更多关于 根节点 的文章

 

随机推荐