2014-08-29 16 views
1

여러 사용자 정의 클래스를 기반으로하는 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); 

각 setState를 (문자열들)를 통해 설정할 수있는 특정 상태를 저장 JTreePanelNode (사용자 정의 클래스)의 객체가 Dynamically change icon of specific nodes in JTree 얻을 getState()를 통해. 그래서 내가 원하는 것은 다음과 같습니다 :

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

어떻게하면 좋을까요? 내가 이해하는 렌더러는 getTreeCellRendererComponent를 가진 모든 노드를 통과하고 setIcon과 여러 ifs()로 선택할 수있는 특정 아이콘을 적용합니다. 그러나 JTreePanelNode 캐스팅 할 수 없습니다. 어떤 해결책?

@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 ; 
} 
+0

왜'value'를'JTreePanelNode'에 캐스트 할 수 없습니까? – MadProgrammer

답변

2

당신은 그 나무에 표현 된 개체에 액세스 할 수 있습니다. 는 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에 따라 더 많은 상태()를 추가 할 수 있습니다.

+1

기술적으로는 올바르지 만 특정 구현을 가정합니다. OP가'DefaultMutableTreeNode'를 사용하지 않으면 어떻게 될까요? – MadProgrammer

+0

hehehe - 예, 당신은 매우 옳았고 좋은 관찰자입니다 !! 나는 깊은 인상을 받았습니다 !! 나는 사용자가 http : //docs.oracle.com/javase/tutorial/uiswing/components/tree.html에서 흔적을 따라 간다고 가정한다. 그러나 나는 그것을 보장 할 수 없다 !! 매우 잘 관찰해라, 그 좋은 일을 계속 =) –

+1

운이 좋을지도 모른다;) – MadProgrammer

4

모든 당신의 JTreePanelNode 클래스에 따라 달라집니다 : 감사합니다 :)

+0

고마워요. 나는 "가치"가 내가 자신의 수업으로 되돌릴 수있는 노드 표현이라는 것을 깨닫지 못했다. – Shiuyin

+0

np, 특별한 트리 노드 클래스를 게시했다면 우리는 모자를 써서 작은 예제를 제공 할 수 있습니다. 그러면 다른 사람들에게 도움이 될 것입니다. – gantners

+0

기본적으로 내가했던 모든 것은 다시 수업에 값을 던져 넣었습니다. 그게 전부 다. – Shiuyin