2009-11-13 76 views
0

我想给一个JTree的特定节点添加颜色(并给出一个图标),而不是像OpenNode,LeafNode等组中的那样。我该如何去做这件事?Java树节点着色

回答

0

最简单的方法是使用DefaultMutableTreeNode构建JTree模型,并设置某个节点的“用户对象”值,然后使用此值确定呈现器在遇到时的行为该节点。

首先我们构建了一个简单的模型,并把它传递给JTree构造:

DefaultMutableTreeNode root = new DefaultMutableTreeNode("Hello"); 
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("Goodbye"); 
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("Bonjour"); 

root.add(child1); 
root.add(child2); 

JTree tree = new JTree(root); 

现在定义自定义的树单元格渲染器:

TreeCellRenderer renderer = new DefaultTreeCellRenderer() { 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
    // Defer to superclass to create initial version of JLabel and then modify (below). 
    JLabel ret = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 

    // We know that value is a DefaultMutableTreeNode so this downcast is safe. 
    MutableTreeNode node = (MutableTreeNode) value; 

    // Inspect user object and change rendering based on this. 
    if ("Hello".equals(node.getUserObject())) { 
     ret.setIcon(...); 
    } 

    // Could also inspect whether node is a leaf node, etc. 
    return ret; 
    } 
}; 
+0

感谢。这个功能就是我一直在寻找的。 – Goutham 2009-11-13 11:09:17

+0

是否有可能在运行时动态地执行它? – Tobias 2010-10-13 08:56:34

+0

是的。假设你更新了你的一个用户对象的状态,并且你希望这个改变导致相应的DefaultMutableTreeNode呈现不同,你需要在你的AbstractTreeModel实例上调用nodeChanged并传递节点来重新渲染。 – Adamski 2010-10-14 14:54:23

2

This tutorial来自Sun展示了如何设置自己的节点图标以及如何区分树中的叶和非叶。