2013-06-12 129 views
0

我知道这个问题以前曾以类似的方式问过,也许是图标。 我想要的是改变树节点的文本的颜色。 事实上,我有一个jTree,我想要设置三个不同的颜色,默认的一个,红色和橙色。JTree单节点前景

的purposse是,如果我比那棵树用另一个,突出两棵树之间的差异(默认意味着没有差异,橙色表示只是分值diff和红色表示节点是完全不同的)

我有两个功能,其中一个trasverse的“原始”树寻找从相比一个节点,并返回false如果{节点}没有找到:

private Boolean findNodeInRefTree(DefaultTreeModel model, Object root, DefaultMutableTreeNode node){ 
    Boolean bRet = false; 
    for (int i = 0; ((i < model.getChildCount(root))&&(!bRet)); i++){ 
     DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(root, i); 
     bRet = node.getUserObject().equals(child.getUserObject()); 
     if (!bRet) 
      bRet = findNodeInRefTree(model, child, node); 
    }//for:i 
    return bRet; 
} 

而另一个功能trasverse“比较”树,并调用上述为每个节点。

private void compareTrees(TreeModel model, Object root){ 

    for (int i = 0; i < model.getChildCount(root); i++){ 
     DefaultMutableTreeNode child = (DefaultMutableTreeNode) model.getChild(root, i);   
     //find if node exists in original 
     DefaultTreeModel modelRef = (DefaultTreeModel) _ref.getModel(); 
     if (!findNodeInRefTree(modelRef, modelRef.getRoot(), child)){ 
      DefaultTreeCellRenderer render = (DefaultTreeCellRenderer) _temp.getCellRenderer(); 
      render.setForeground(Color.RED); 
      _temp.setCellRenderer(render); 
     }//fi    
     _new.insertNodeInto((DefaultMutableTreeNode) child, (DefaultMutableTreeNode) root, i);    
     compareTrees(model, child); 
    }//for:i 
} 

然后,当它结束我刚才设置的新树{} _new到新树{} _temp的模型,和树添加到其面板。但树没有任何不同的颜色。很明显,我正在测试不同的树木。任何建议?

+0

为了更好地帮助越早,张贴[SSCCE(http://sscce.org/)。 –

回答

1

如果我正确理解了您的代码,请在创建时进行比较,并在方法compareTrees内为每个树节点(即多次)设置呈示器。

不幸的是,这不是tree renderers处理的方式。渲染器在渲染树组件期间根据请求准备。因此,事先设置多个渲染器不会做任何有用的事情。

一种可能的方法是做了比较,并保存在你的树模型的结果(即颜色)。然后,你可以写一个基本的树渲染器,读取当前节点此值,并设置相应的渲染色彩。

+0

事实上,我首先加载来自不同来源的两棵树(XML文件) 然后,我通过第二个,这是一个我用的第一棵树比较走,并根据不同后,我又建了时间树移除第二。 – Wolfchamane