2013-07-15 116 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