if ( selected )
lbl = (JLabel) super.getTreeCellRendererComponent( tree, node, selected, expanded, leaf, row, hasFocus );
else
lbl = new JLabel();
if(node.getLevel() == 2) {
VNode vNode = (VNode)node.getUserObject();
if (vNode.getType() == 0) {
lbl .setIcon(this.iconError);
}
else if (vNode.getType() ==1) {
lbl .setIcon(this.iconOk);
}
else if (vNode.getType() == 2) {
lbl .setIcon(this.iconUnknown);
}
}
return lbl ;你可以试试这个,我写过自己定义的TreeCellRenderer ,应该可以
lbl = (JLabel) super.getTreeCellRendererComponent( tree, node, selected, expanded, leaf, row, hasFocus );
else
lbl = new JLabel();
if(node.getLevel() == 2) {
VNode vNode = (VNode)node.getUserObject();
if (vNode.getType() == 0) {
lbl .setIcon(this.iconError);
}
else if (vNode.getType() ==1) {
lbl .setIcon(this.iconOk);
}
else if (vNode.getType() == 2) {
lbl .setIcon(this.iconUnknown);
}
}
return lbl ;你可以试试这个,我写过自己定义的TreeCellRenderer ,应该可以
我跟踪过node.getLevel()的值,总是零。
我现在试试,有问题再来请教,希望各位继续指教!
谢谢!
还没解决,请高手继续指点!
谢谢!
谢谢你!
可是我的树从外观看起来没有问题啊。
真头痛,我手头的树上也没有一个定制(某层次)树节点的例子,哪位朋友有完整的例子能麻烦一下贴出来我学习学习吗?
谢谢!
看来我构造树的过程很可能有问题了。
我构造树的方法是先构造一个根节点,然后用它创建一个treeModel对象,然后构造一级节点,把它通过treeModel.insertNodeInto()插入到树的根节点下,再构造二级节点,把它插入到一级节点下……
代码太罗嗦,我写一下梗概吧:class VTree extends JTree { private DefaultMutableTreeNode root;
private DefaultTreeModel treeModel;
private vectorNodeLevel1 = new Vector(); //记录创建的一级节点,以便在随后逐个为其插入子节点用 //构造函数,只是创建数据库链接,别无他用
public VTree() {
try {
this.conMgr = new ConnectionMgr();
if (this.con == null)
this.con = this.conMgr.getDBConnection();
}
catch (Exception e) { } //构造树的工作在这里完成,树的信息从数据库中读出
public void buildTree() {
this.root = new DefaultMutableTreeNode("根");
this.treeModel = new DefaultTreeModel(root); try {
String sql = "select ……";
ResultSet rs = this.pstmt.executeQuery();
while (rs.next()) {
String nodeName = (String)rs.getString(1);
String nodeType = (String)rs.getString(2);
VNodeLevel1 vNodeLevel1 = new VNodeLevel1(nodeName,nodeType); //构造一个userObject
DefaultMutableTreeNode treeNodeLevel1 = new DefaultMutableTreeNode(vNodeLevel1); //构造第一级节点(根的孩子节点)
this.treeModel.insertNodeInto(treeNodeLevel1, this.root, this.root.getChildCount()); //插入一级节点
……
this.vectorNodeLevel1.addElement(treeNodeLevel1); //把每个一级节点记入一个Vector,以便下面为每个一级节点构造其子节点
} for (int i = 0; i < this.vectorNodeLevel1.size(); i++) { //逐个取出一级节点,为其添加子节点
String sqlSubNode = "....";
ResultSet rs = this.pstmt.executeQuery();
while (rs.next()) {
String nodeName = (String)rs.getString(1);
String nodeType = (String)rs.getString(2);
VNode vNode = new VNode(nodeName,nodeType); //构造二级节点的userObject
DefaultMutableTreeNode treeNodeLevel2 = new DefaultMutableTreeNode(vNode); //构造二级节点
DefaultMutableTreeNode treeNodeLevel1 = (DefaultMutableTreeNode)vectorNodeLevel1.elementAt(i); //从Vector中取出一级节点
this.treeModel.insertNodeInto(treeNodeLevel2, treeNodeLevel1, treeNodeLevel1.getChildCount()); //插入二级节点
}}最后是在另一个文件中如此调用上面的类以生成一个树的实例的:
VTree tree = new VTree();
tree.buildTree();
{
"swing", // 0
"platf", // 1
"basic", // 2
"metal", // 3
"JTree"}; // 4 CheckNode[] nodes = new CheckNode[strs.length];
for (int i = 0; i < strs.length; i++)
{
nodes[i] = new CheckNode(strs[i]);
}
nodes[0].add(nodes[1]);
nodes[1].add(nodes[2]);
nodes[1].add(nodes[3]);
nodes[0].add(nodes[4]);
nodes[3].setSelected(true);
JTree tree = new JTree(nodes[0]);
tree.setCellRenderer(new CellTreeCellRenderer());
先把node.getLevel()弄好再说,看这个是不是node.getLevel()总是0,如果不是就看看树的构造有什么不同,说实话,我没找到你的程序里有setCellRenderer方法
你上面代码中的CheckNode就是继承DefaultMutableTreeNode的类、也就是树节点吧?
我构造树的方法和你不一样,我是通过treeModel.insertNodeInto()的方法逐个插入节点的,见我上面的代码。
另外,setCellRenderer方法我没有写出来,但我在在两个地方都试验过,都不行,一个是在树构造完成后,也就是上面我的最后两行代码的后面,即:
VTree tree = new VTree();
tree.buildTree();
tree.setCellRenderer(new CellTreeCellRenderer());//就是这里啦!
另一种方法是加在构造树的方法、即上面的tree.buildTree();中。node.getLevel()还是总是为0,唉。