簡體   English   中英

JTree單節點前景

[英]JTree single node foreground

我知道以前已經以類似的方式(可能是圖標)問過這個問題。 我正在嘗試的是更改樹節點文本的顏色。 實際上,我有一個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},並將樹添加到其面板中。 但是樹沒有任何不同的顏色。 顯然,我正在測試不同的樹。 有什么建議嗎?

如果我正確理解您的代碼,則在創建時進行比較,並在方法compareTrees為每個樹節點設置渲染器(即多次)。

不幸的是,這不是擺動處理樹渲染器的方式。 在渲染樹組件期間,應要求准備渲染器。 因此,事先設置多個渲染器將無濟於事。

一種可能的方法是進行比較並將結果(即顏色)保存在樹模型中。 然后,您可以編寫一個基本的樹渲染器,以讀取當前節點的該值並相應地設置渲染顏色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM