2013-07-15 119 views
0

我瘋了,因爲我不明白我做錯了什麼。我需要我的樹的每個節點具有不同的圖標,就好像它是正確的,不正確的或需要更新。我看到了Oracle文檔和許多網頁(包括Stackoverflow),但是我的代碼只顯示了所有具有相同圖標的節點。對不起,如果我做錯了,這是我的第一次POST:>DefaultTreeCellRenderer不按預期方式工作

顯示: 我不能顯示,因爲我沒有聲望>。 <

想象一棵樹,想象它總是顯示葉圖標gif新圖標圖標。似乎只有狀態纔會聽最後一個節點。

下面的代碼(所有的瓦爾正確創建,像gifNew圖標太):

圖標:

static Icon closedIcon = new ImageIcon("folder.png"); 
    static Icon openIcon = new ImageIcon("folder.png"); 
    static Icon leafIcon = new ImageIcon("file.png"); 
    static Icon gifWarn = new ImageIcon("warn.gif"); 
    static Icon gifOk = new ImageIcon("ok.gif"); 
    static Icon gifNew = new ImageIcon("plus.gif"); 
    static Icon gifError = new ImageIcon("error.gif"); 

電話:

tree.setCellRenderer(new TreeRenderer()); 

渲染:

private static class TreeRenderer extends DefaultTreeCellRenderer { 


     public Component getTreeCellRendererComponent(JTree tree, Object value, 
      boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) { 

      super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus); 
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
      String s = node.getUserObject().toString(); 
      String error; 
      if (actualTree.equals("DOORS")){ 
       error = checkTypeError(s, valuesClass.listOfValuesDOORS); 
       //System.out.println("DOORS - S: "+s); 
      }else{ 
       error = checkTypeError(s, valuesClass.listOfValuesTC); 
       //System.out.println("TC - S: "+s); 
      } 

      switch (error) { 
       case "CORRECT": 
        setOpenIcon(openIcon); 
        setClosedIcon(closedIcon); 
        setLeafIcon(leafIcon); 
        break; 
       case "CREATE": 
        setOpenIcon(gifNew); 
        setClosedIcon(gifNew); 
        setLeafIcon(gifNew); 
        break; 
       case "DELETE": 
        setOpenIcon(gifError); 
        setClosedIcon(gifError); 
        setLeafIcon(gifError); 
        break; 
       case "UPDATE": 
        setOpenIcon(gifWarn); 
        setClosedIcon(gifWarn); 
        setLeafIcon(gifWarn); 
        break; 
       default: 
        setOpenIcon(openIcon); 
        setClosedIcon(closedIcon); 
        setLeafIcon(leafIcon); 
        //System.err.println("ERROR IN RENDERER. VALUE: "+error); 
        break; 
      } 

      return this; 
     } 

     /***************************************** 
     * Function that return which error have the actual node to push the icon when the tree is created. 
     *****************************************/ 
     protected static String checkTypeError(String txt, List<valuesClass> list){ 

      for (int i = 0; i < list.size(); i++) { 
       if (list.get(i).text.equals(txt)) 
        if (list.get(i).create == true){ 
         return "CREATE"; 
        }else if (list.get(i).delete == true){ 
         return "DELETE"; 
        }else if (list.get(i).update == true){ 
         return "UPDATE"; 
        }else{ 

         return "CORRECT"; 
        } 
      } 
      return "DEFAULT"; 
     } 
    } 

回答

1

您描述的行爲是由於您沒有正確設置switch語句中的節點圖標而造成的。 setOpenIcon(),setClosedIcon()等設置了渲染器將用於整個樹的圖標。所以在最後一個節點採取的行動將決定最後將呈現哪些圖標。

DefaultTreeCellRenderer延伸了JLabel。該組件將用於每個節點來呈現其內容。這是組件的圖標,需要設置即你的代碼應該是這樣的:

一定要設置的圖標在所有情況下,雖然並確保您瞭解渲染器是如何用來渲染樹節點(同一個實例是爲所有節點重複使用)

+0

O.O!真棒!有用!現在我的樹有每個案件的不同圖標!現在我可以繼續這個項目了! :>我不能給你低聲譽水平的聲望,但你是一個主人:P – chiri4

+0

也許你可以接受答案,那麼因爲它已經爲你工作:) –

+0

噢是的,現在被接受。謝謝! – chiri4

0

在Java 7的switch語句中允許使用字符串,雖然我還沒有使用它們,但是您的語法看起來正確。我懷疑錯誤字符串的值不是你所期望的。

由於殼體值全部上情況下,線

switch (error) { 

更改爲

switch (error.toUpperCase()) { 

,看看是否能解決它。如果沒有,則打印出錯誤值,或者使用調試器檢查它的值。

編輯:按照我們下面的討論,我懷疑你的樹節點是DefaultMutableTreeNode對象(是嗎?),並且你正在將數據存儲在用戶對象中。

在這種情況下,施放價值DefaultMutableTreeNode,並提取數據:

DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
MyData myData = (MyData) node.getUserObject(); 

然後,您可以測試myData的工作出了什麼圖標設置。

+0

我正在處理1.7的庫。開關與字符串正確工作。 – chiri4

+0

**可能是我的錯誤是:** String s = node.getUserObject()。toString(); 我試圖捕捉節點的文本,並且此功能不正確。任何人都可以告訴我如何提取實際節點的文本? – chiri4

+0

是的,您需要從value參數中獲取節點的內容。將它轉換爲您在樹中存儲的節點的類型,然後獲取它的值。 – andy256