2014-08-29 2 views
1

У меня есть JTree, основанный на нескольких пользовательских классах. Я хочу указать несколько Узлов на определенный значок. Поэтому я сделал следующий код, основанный на этой ссылке: Dynamically change icon of specific nodes in JTreeИзменение значков JTree на основе пользовательских состояний объектов

 DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer() { 
     private static final long serialVersionUID = 1L; 
     private Icon good = new ImageIcon(getClass().getResource("/good.png")); 
     private Icon dunno = new ImageIcon(getClass().getResource("/dunno.png")); 
     private Icon bad = new ImageIcon(getClass().getResource("/bad.png")); 

     @Override 
     public Component getTreeCellRendererComponent(JTree tree, 
      Object value, boolean selected, boolean expanded, 
      boolean isLeaf, int row, boolean focused) { 

      Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); 

      // JTreePanelNode node = (JTreePanelNode)c; - not possible 
      return c; 
     } 
    }; 
    this.getTree().setCellRenderer(renderer); 

Каждый из моих узлов является объектом JTreePanelNode (пользовательский класс), который сохраняет определенное состояние, которое может быть установлено с помощью SetState (String s) и получить через getState(). Так что я хочу что-то вроде этого:

if(node.getState().equals("good")) .. 
else if(node.getState.equals("bad")) .. 
else .. 

Как я могу достичь чего-то подобного? Из того, что я понимаю, рендеринг проходит через каждый узел с помощью getTreeCellRendererComponent и применяет конкретный значок, который я могу выбрать с помощью setIcon и нескольких ifs(). Однако я не могу использовать JTreePanelNode. Любое решение? Спасибо :)

+0

Почему вы не можете использовать 'value' для' JTreePanelNode'? – MadProgrammer

ответ

2

вы можете получить доступ к объекту, представленному в этом дереве:

@Override 
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) { 

    Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
    Object representedObject = node.getUserObject(); 

    JLabel superLabel = super.getTreeCellRendererComponent(); 
    String text = label.getText(); 

    if(object.isGood()){ //i don't know your code 
     superLabel .setText (text +"goooooooood"); 
    }else{ 
     superLabel .setText (text +"badbadbabd"); 
    } 
    return superLabel ; 
} 
+1

Хотя это технически правильно, это предполагает конкретную реализацию. Что делать, если OP не использует 'DefaultMutableTreeNode'? – MadProgrammer

+0

hehehe - да, вы очень правы и хороший наблюдатель! я глубоко впечатлен !! Я предполагаю, что пользователь следит за трейлом по адресу http: //docs.oracle.com/javase/tutorial/uiswing/components/tree.html ... но я не могу этого гарантировать! очень наблюдательный, не отставайте от этой хорошей работы =) –

+1

Ну, вам может повезти;) – MadProgrammer

4

Все зависит от вашего JTreePanelNode класса. если он реализует интерфейс TreeNode вы хорошо идти с:

public Component getTreeCellRendererComponent(JTree tree, Object value, 
     boolean sel, boolean expanded, boolean leaf, int row, 
     boolean hasFocus) { 
    Component comp = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, 
      row, hasFocus); 
    TreeNode current = (TreeNode)value; 

    if (leaf) { 
     //set leaf icon 
    } else if (expanded) { 
     //set expanded icon 
    } else { 
     // set default state 
    } 

    if (hasFocus) 
     //set what it looks like if focused 

    else if (selected) 
     //set what it looks like if selected 

    else 
     //set default l&f 

    comp.setIcon(whatevericonset in above conditions); 

    return comp; 
} 

Конечно, вы можете добавить много больше состояний, в зависимости от вашего узла class.getState().

+0

Большое спасибо. Я не понимал, что «значение» - это представление узла, которое я могу вернуть обратно в свой класс. – Shiuyin

+0

np, если вы разместили свой специальный класс узлов дерева, мы могли бы дать вам небольшой рабочий пример, который тогда также был бы полезен другим. – gantners

+0

Ну, в основном все, что я сделал, - это отличное значение для моего класса. Это все, что мне нужно. – Shiuyin