这两天被这个JTree着实刁难了一番。原因是我的不同寻常的需求给自己带来了很多麻烦, 本文不讨论其他,只研究一下处理这种需求的方法。下面是创建树的CODE。

public void createTree(String[] string)...{
JTree stepTree;
DefaultMutableTreeNode fatherNode = null; //定义父节点
DefaultMutableTreeNode childNode = null; //定义子节点
fatherNode = new DefaultMutableTreeNode(treeStr[0]); //添加父节点

for(int i=1;i<treeStr.length;i++)...{
childNode = new DefaultMutableTreeNode(treeStr[i]); //创建子节点
fatherNode.add(childNode); //添加子节点到父结点上
}
stepTree = new JTree(fatherNode); //创建一个树
stepTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); //设置同一个时间选择一个节点
stepTree.setRowHeight(20);
stepTree.addTreeSelectionListener(this); //添加监听器
stepTree.setBorder(BorderFactory.createEmptyBorder(0,0,0,3)); //设置树结点的位置
}有点眼熟吧,这段代码参考了SUN的教程,哈哈~~,注意,我没有用“DefaultTreeModel”类来做,所以请注意区别。
下面说一下我的需求,我有两个DIalog窗口(JDialog),每个窗口里都有一个JPanel(两个窗口使用的是同一个JPanel的不同的实例),这个JPanel中就存有上面这棵树,为了使这两个独立窗口的树操作起来像是在使用一棵树,就要人为的给树的节点作标记,但是在监听的时候就会遇到一些问题。如果使用stepTree.setSelectionRow(int i)这个方法来作标记,在显示的时候会出现关闭窗口后又弹出一次窗口的情况。
举例说明:我在窗口A中的树上选择了窗口B,期间我使用了上述标记方法,使得B中指定的树节点高亮显示,当我关闭B窗口的时候,系统又会弹出一个B窗口,这个窗口高亮的树节点是指向A的那个。
现在要解决的问题就是如何不让第二个窗口弹出来。我试验了很多方法,其中典型的有把JPanel和JTree分别设置成静态的,供两个窗口使用,但是,当使用A.show()或者B.show()的弹出新窗口的时候,静态的实例竟然无法显示了,无奈中,只能选择从树本身下手。
我仔细的对代码进行了跟踪,发现只要使用stepTree.setSelectionRow(int i),都会触发监听器,能不能在作标记之前先关闭监听呢,标记之后再加载监听器就可以了嘛。经过一番尝试,果然成功了。下面就是这段代码,感兴趣的朋友看看吧。

/** *//**
* 树监听器
* @param TreeSelectionEvent e
*/
public void valueChanged(TreeSelectionEvent e) ...{
String strSelectedPath = e.getPath().getLastPathComponent().toString();
for(int i = 0 ; i < treeStr.length ; i++)...{
if(owner != null && strSelectedPath != null)...{
if(strSelectedPath.equals(treeStr[i]))...{
//关闭当前窗口
oldui.dispose();
//获取指定窗口所有的Tree
JTree tree = panel.stepTree;
/**//*
由于直接执行tree.setSelectionRow(i);
会触发valueChange的监听,
需要先关闭指定窗口的监听,再执行选择行的代码
,最后再启动监听,ui为新窗口的实例
*/
tree.removeTreeSelectionListener(ui);
tree.setSelectionRow(i);
tree.addTreeSelectionListener(ui);
//弹出新窗口
ui.show();
return;
}
}
}
}PS:本人由于某些原因不得不面对这种需求,希望大家以后不要碰到这种问题哈。
&spm=1001.2101.3001.5002&articleId=1480325&d=1&t=3&u=a882b701faf94cab877d570eb163c5ac)
5057

被折叠的 条评论
为什么被折叠?



