2013-07-15 6 views
0

Я сумасшедший, потому что я не понимаю, что я делаю неправильно. Мне нужно, чтобы каждый узел моего дерева имел другой значок, как будто он правильный, неправильный или нуждается в обновлении. Я видел документацию Oracle и множество веб-страниц (включая Stackoverflow), но мой код просто показывает все узлы с одинаковым значком. Я извиняюсь, если я сделал что-то не так, это мой первый пост:>DefaultTreeCellRenderer не работает как ожидалось

Дисплей: Я не могу показать, потому что я не имеют репутацию>. <

Представьте себе дерево и представьте, что он всегда показывает листIcon с gifNew значок. Кажется, что только состояние будет слушать последний узел.

Вот код (все вары правильно созданы, значки, такие как gifNew тоже):

ICONS:

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()); 

Renderer:

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

Oww yea, прямо сейчас принято. Благодаря! – chiri4

0

Строки разрешены в операторах switch в Java 7, и пока я их еще не использовал, ваш синтаксис выглядит корректно. Я подозреваю, что значения ошибки String - это не то, что вы ожидаете.

Поскольку значения случаев все в верхнем регистре, изменить линию

switch (error) { 

к

switch (error.toUpperCase()) { 

и посмотреть, если это решает ее. Если это не так, распечатайте значение ошибки или используйте отладчик, чтобы проверить его значение.

EDIT: после нашего обсуждения ниже я подозреваю, что ваши узлы дерева являются объектами DefaultMutableTreeNode (верно?) И что вы храните данные в объекте пользователя.

В этом случае привести значение к DefaultMutableTreeNode и извлекать ваши данные:

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

Вы можете проверить MyData, чтобы выяснить, что значок, чтобы установить.

+0

Я делаю с библиотеками 1.7. Переключатель работает правильно со строками. – chiri4

+0

** Возможно, моя ошибка: ** String s = node.getUserObject(). ToString(); Я пытаюсь поймать текст узла, и эта функция неверна. Кто-нибудь может сказать мне, как я могу извлечь текст фактического узла? – chiri4

+0

Да, вам нужно получить содержимое своего узла из параметра значения. Передайте его типу узла вашего магазина в дереве, а затем получите его значение. – andy256

Смежные вопросы