我知道之前已经以类似的方式询问过这个问题,也许是为了图标。 我正在尝试的是更改树节点文本的颜色。 事实上,我有一个jTree,我想设置三种不同颜色,默认颜色,红色和橙色。
目的是,如果我将该树与另一棵树进行比较,则突出显示两棵树之间的差异(默认表示没有差异,橙色表示只是值差异,红色表示节点完全不同)
我有两个函数,一个遍历“原始”树,从比较的一个查找节点,如果找不到{node},则返回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;
}
另一个遍历“比较”树的函数,并为每个节点调用上面的内容。
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 :(得分:1)
如果我正确理解您的代码,您可以在创建时进行比较,并在方法compareTrees
内为每个树节点(即多次)设置渲染器。
不幸的是,这不是tree renderers处理的方式。在渲染树组件期间,请求准备渲染器。因此,事先设置多个渲染器将不起任何作用。
一种可能的方法是进行比较并将结果(即颜色)保存在树模型中。然后,您可以编写基本树渲染器,为当前节点读取此值并相应地设置渲染颜色。