2014-07-10 6 views
0

jtree에 질문을 추가하는 프로그램이 있습니다. Jtree에 대한 각 질문은 3 가지 속성을 가진 Question 유형입니다. 이름, id 및 questionText. 내 Jtree에 질문 이름 만 표시하려고하지만 노드를 선택하면 텍스트 상자에 question 텍스트가 표시됩니다.JTree 객체 유형은 객체의 일부 속성을 표시하지만 선택시 전체 객체를 반환합니다.

문제는 내가 원하는대로 Jtree가 질문의 이름을 표시하지만, 트리의 노드를 선택하면 ClassCastException이 발생합니다. 이는 내 treeSelectionListener 메소드의 getUserObject() 때문입니다. getUserObject()에 의해 반환 된 String을 가져 와서 Question 클래스로 캐스팅하려고합니다. getUserObject()없이 questionText 나 ​​id와 같은 선택된 String의 Question 클래스 속성을 얻는 방법 또는이 트리를 나타내는 다른 방법이 있습니까? 대신 단순히

DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(createdQuestion.toString()); 

의, @Ajay처럼

public Question rootQ = new Question("Questions", UUID.randomUUID().toString(), "What is your name?"); 
public DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(rootQ.toString()); 
public JTree tree = new JTree(rootNode); 

initialise(){ 
//....other code to initilise 
panel.add(new JScrollPane(tree)); 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
tree.setShowsRootHandles(true); 
tree.addTreeSelectionListener(treeMenuClicked); 
tree.setRootVisible(true); 
tree.setVisible(true); 
panel.add(addChild()); 
} 

public TreeSelectionListener treeMenuClicked = new TreeSelectionListener() 
{ 

public void valueChanged(TreeSelectionEvent e) 
{ 
    TreePath currentSelection = tree.getSelectionPath(); 
    if(currentSelection != null){ 
    DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)currentSelection.getLastPathComponent(); 
    Object nodeInfo = currentNode.getUserObject(); 
    Question questionText = (Question)nodeInfo; 
    txtQuestion.setText(questionText.getQuestion()); 
    } 
}}; 

public JButton addChild() 
{ 
    JButton btnAddChild = new JButton("Add Child"); 
    btnAddChild.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent arg0) 
     { String userQuestion = txtQuestion.getText(); 
      TreePath currentSelection = tree.getSelectionPath(); 
      if (currentSelection != null) { 
       Question createdQuestion = new Question(userQuestion,UUID.randomUUID().toString(),userQuestion); 
       DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) currentSelection.getLastPathComponent(); 
       DefaultTreeModel model = ((DefaultTreeModel) tree.getModel()); 
       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(createdQuestion.toString()); 
       currentNode.add(newNode); 
       model.nodeStructureChanged(currentNode); 
      } 
     }}); 
    btnAddChild.setBounds(609, 374, 117, 47); 
    return btnAddChild; 
} 
+1

'DefaultMutableTreeNode'의 인수로 문자열 ('rootQ.toString()')을 전달하는 것처럼 보입니다. qText를 "get"해야하기 때문에 생성자 인자로'rootQ' 만 사용하십시오. – Ajay

+0

@Ajay toString을 사용하지 않고이 작업을 시도한 결과 트리에서 전체 개체 속성을 반환한다는 것을 알았습니다. 그래서 내 나무에있는 노드는 이름, id 및 질문을 갖습니다. – geek2be

답변

0

그의 코멘트와 함께 시사 : 트리를 생성하는 코드의

public class Question 
{ 
public String name; 
public String id; 
public String qText; 
public Question(String name,String id, String text) 
{ 
     this.name = name; 
     this.id = id; 
     this.qText = text; 
} 

public String getQuestion() 
{ return qText; } 

public String getName() 
{ return name;} 

public String getId() 
{ return id;} 

public void setQuestionText(String text) 
{ qText= text; } 

public void setId(String uid) 
{ id = uid;} 

@Override 
public String toString() 
{ return name; } 
} 

부품 : 여기

내 코드입니다 do

DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(createdQuestion); 

현재 사용자 개체가 API가 아닌 String으로 설정되어 있습니다.

또한 항상 선택 경로를 얻지 않고 TreePath.getLastPathComponent()을 호출하는 대신 선택된 노드를 tree.getLastSelectedPathComponent()으로 가져올 수 있습니다.

public void valueChanged(TreeSelectionEvent e) 
{ 
    DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); 
    if(currentNode != null){   
     Object nodeInfo = currentNode.getUserObject(); 
     Question questionText = (Question)nodeInfo; 
     txtQuestion.setText(questionText.getQuestion()); 
    } 
}}; 
+0

잘 작동합니다. 노드에 자식을 추가 할 때도 toString을 가졌습니다. – geek2be