1、初始树的节点是否展开问题
我们知道树的初始化代码如下:
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
JTree tree = new JTree(new DefaultTreeModel(root));
root.add(new DefaultMutableTreeNode("node1"));
root.add(new DefaultMutableTreeNode("node2"));
root.add(new DefaultMutableTreeNode("node3"));
root.add(new DefaultMutableTreeNode("node4"));
root.add(new DefaultMutableTreeNode("node5"));
这个时候树默认是收缩的。
若是先给root节点增加孩子节点,再生成树,则会是展开的,如下这般:
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
root.add(new DefaultMutableTreeNode("node1"));
root.add(new DefaultMutableTreeNode("node2"));
root.add(new DefaultMutableTreeNode("node3"));
root.add(new DefaultMutableTreeNode("node4"));
root.add(new DefaultMutableTreeNode("node5"));
JTree tree = new JTree(new DefaultTreeModel(root));
2、改变节点的图标:
我们生成节点的时候若不指定CellRenderer,则默认使用的是DefaultTreeCellRenderer,它在渲染节点的时候使用的是系统默认的,就如我们最开始生成的那般。若要改变节点的图标或者文字说明,就要重写这个类。
public class ShorenNodeRenderer extends DefaultTreeCellRenderer{
private static final long serialVersionUID = 1L;
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);
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
//StringValue是value调用toString()后的转来的描述性文字,所以在节点中包装的
//对象应自己重写toString方法来实现自己想要的结果
// String stringValue = tree.convertValueToText(value, sel, expanded, leaf, row, hasFocus);
// setText(stringValue);
//与上述方法等价
if(!node.isRoot())
{
TargetMsg msg = (TargetMsg)node.getUserObject();
setText(msg.getName());
setIcon(null);
}
return this;
}//end of getTreeCellRendererComponent
}
最重要的一句是
DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
得到node,然后根据node的基本信息判断节点的类别,然后给予相应的设置(设置图片和文字说明)。
3、分支线与根节点的显示:
tree.setShowsRootHandles(true); //显示前面的分支线
tree.setRootVisible(false); //不显示根节点
设置前后对比如下:
另外注意一个问题,组件之间是通过add动作绑定关系的,不能直接把一个界面上的tree赋值给另一个界面上的tree。只能逐个节点赋值或者从当前界面上delete,再add到另一个界面上去。