2013-06-12 61 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