2013-03-01 1 views
1

여러 노드가있는 JTree가 있고 각 노드에는 사용자에게 표시하려는 다른 연관된 JPanel이 있습니다. 커스텀 TreeCellRenderer를 사용해 왔지만 현재 코드가 그대로 작동하지만, 조금 복잡하고 걱정이된다.JTree 선택에 따라 다른 JPanel 표시 방법을 최적화하는 방법

1) 트리 노드를 선택한 채로두면 코드 JPanel을 계속 새로 고칠 것입니다. 선택한 노드가 JPanel을 한 번 표시하면 다른 노드가 선택되지 않으면이 노드를 다시 표시하지 않습니다.

2) 타이머가 node1에서 실행되는 동안 사용자가 다른 노드 (node2라고 가정 해 봅시다)를 선택하면 사용자가 멀리 탐색 한 이후 node1의 JPanel을 표시하는 것을 원하지 않습니다.

Component ret = super.getTreeCellRendererComponent(tree, value, 
      selected, expanded, leaf, row, hasFocus); 

    DefaultMutableTreeNode entry = (DefaultMutableTreeNode)value; 


    // if the node is selected 
    if(sel) 
    { 
// set the background of the node 
     setBackgroundNonSelectionColor(new Color(0x91, 0xC5, 0xFF)); 
// display the JPanel for the node 
     displayPanel(entry); 
    } 
    else 
    { 
// if the node isn't selected then no background selection color 
     setBackgroundNonSelectionColor(Color.WHITE); 
    } 


    return ret; 

displayPanel 기능 :

// display the node's JPanel after sleeping for 1s 
private void displayPanel(final DefaultMutableTreeNode entry) 
{ 
    Thread thr = new Thread(){ 

     public void run(){ 

       // sleep for 1000ms 
        CF.sleep("1000"); 

// display the panel for this node 
        CF.displayPanel(entry); 
      } 
      }; 
    thr.start(); 
} 

이 DefaultTreeCellRenderer는 여전히 나에게 약간의 혼란, 솔직히 말해서

여기에 관심을 내 코드입니다. 이 방법을 효율적으로 실행하는 방법에 대한 조언을 주시면 감사하겠습니다.

+0

첫 번째 코드의 컨텍스트가 명확하지 않지만 어디에 포함되어 있습니까? 또한 트리 선택 이벤트를 사용하여 'JPanel'을 표시하도록 선택하지 않는 이유는 무엇입니까? – asermax

+0

죄송합니다, 코드는 내 클래스 내에서 DefaultTreeCellRenderer를 확장합니다. 더 많은 컨텍스트를 원한다면 나머지 코드를 포함 할 수 있습니다. 나는 현재 트리 션 이벤트를 사용하고 있다고 생각하지 않았습니다. 왜냐하면 저는 현재 그곳에서 액션을 듣고 있지 않기 때문에 더 좋은 아이디어 일 것입니다. – Matt

답변

2

아마도 여기에 뭔가 빠졌지 만 트리에서 트리 선택 수신기를 사용할 수 없습니까?

tree = new JTree(treeModel); 
tree.addTreeSelectionListener(new TreeSelectionListener() {  
    public void valueChanged(TreeSelectionEvent arg0) { 
     //Code here to get selection and display panel 
    } 
}); 
+0

그래, 나는 이것을 간과하고 지나치게 복잡하게 만들었다. 5 분 안에 답을 수락합니다. 감사합니다 – Matt

+0

JTree가 ActionListener를 허용하지 않습니다 –

+0

Mistype, TreeSelectionListener, 코드가 정확합니다. –

1

TreeCellRenderer은 "렌더링"을위한 것입니다. 주어진 객체의 표현은 무엇입니까? 라벨인가요? 체크 박스입니까? 더 복잡한 무엇인가? 기본적으로 JTree의 각 노드 표현을 디스플레이에 "인쇄"하는 데 사용됩니다. 렌더링은 예측할 수없는 순간에 여러 번 발생할 수 있으므로 선택을 듣기에 좋지 않습니다.

당신이 찾고있는 것은 TreeSelectionListener이며 구현할 단일 방법이 있으며 JTree가 선택 될 때마다 트리거됩니다.

수신기를 javax.swing.JTree.getSelectionModel().addTreeSelectionListener()과 함께 추가하십시오.

final JTree tree = ...; 
tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { 
    public void valueChanged(TreeSelectionEvent e) { 
     if (tree.getSelectionPath()!=null) 
      displayPanel((DefaultMutableTreeNode) tree.getSelectionPath().getLastPathComponent()); 
    } 
}); 
+0

안녕 Guillaume, 당신은 StackOverflow에 대한 메시지를 보낼 수 있는지 모르겠지만, 나를 invokeLater하고 나를 downvoting 아니라 지시 해 주셔서 감사합니다. 현재 invokeLater를 사용하지 않고 내 프로그램 전체에서 내 GUI를 업데이트합니다. 내 코드 전체를 파싱하고 업데이트해야합니다. – Matt

관련 문제