2013-01-09 2 views
1

처음으로 JTree을 만들려고하지만 트리에 내 노드를 추가하려고하면 변경 사항이 적용되지 않고 표시되는 모든 노드에 기본 노드가있는 트리입니다 (색상, 스포츠, 음식).JTree가 추가 된 노드를 표시하지 않습니다.

내 주요 패널 코드가있는 나무가있는 :

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
public class Scenario1Panel extends JPanel 
{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public Scenario1Tree scenario1Tree; 

public Scenario1Panel() 
{ 
    scenario1Tree = new Scenario1Tree(); 
    add(scenario1Tree); 
} 
public static void main(String args[]) 
{ 
    try 
    { 
     String lookAndFeel = UIManager.getSystemLookAndFeelClassName(); 
     System.out.println(lookAndFeel); 
     UIManager.setLookAndFeel(lookAndFeel); 
    } 
    catch(Exception e) 
    { 
     System.out.println("couldn't get that LookAndFeel"); 
    } 

    Scenario1Panel mgr = new Scenario1Panel(); 

    JFrame frame = new JFrame(); 

    frame.add(mgr); 
    frame.pack(); 
    frame.setVisible(true); 

} 

}

내 트리 코드는 다음과 같습니다

import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.UIManager; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreeSelectionModel; 
public class Scenario1Tree extends JTree 
{ 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private JTree tree; 

public Scenario1Tree() 
{ 
    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Scenario1"); 
    createNodes(top); 
    tree = new JTree(top); 

    //Create a tree that allows one selection at a time. 
    tree.getSelectionModel().setSelectionMode 
     (TreeSelectionModel.SINGLE_TREE_SELECTION); 

    //Create the scroll pane and add the tree to it. 
    JScrollPane treeView = new JScrollPane(tree); 


} 

private void createNodes(DefaultMutableTreeNode top) { 
    DefaultMutableTreeNode loginUser1 = null; 
    DefaultMutableTreeNode addNewUsers = null; 
    DefaultMutableTreeNode addNewUsersBreakout = null; 

    loginUser1 = new DefaultMutableTreeNode("Login User 1"); 
    top.add(logintUser1); 

    addNewUsers = new DefaultMutableTreeNode("Add New Users"); 
    top.add(addNewUsers); 

    addNewUsersBreakout = new DefaultMutableTreeNode("Add User2"); 
    addNewUsers.add(addNewUsersBreakout); 
    addNewUsersBreakout = new DefaultMutableTreeNode("Add User3"); 
    addNewUsers.add(addNewUsersBreakout); 
    addNewUsersBreakout = new DefaultMutableTreeNode("Add User4"); 
    addNewUsers.add(addNewUsersBreakout); 
    addNewUsersBreakout = new DefaultMutableTreeNode("Add User5"); 
    addNewUsers.add(addNewUsersBreakout); 

} 

public static void main(String args[]) 
{ 
    try 
    { 
     String lookAndFeel = UIManager.getSystemLookAndFeelClassName(); 
     System.out.println(lookAndFeel); 
     UIManager.setLookAndFeel(lookAndFeel); 
    } 
    catch(Exception e) 
    { 
     System.out.println("couldn't get that LookAndFeel"); 
    } 

    Scenario1Tree tree = new Scenario1Tree(); 

    JFrame frame = new JFrame(); 

    frame.add(tree); 
    frame.pack(); 
    frame.setVisible(true); 

} 

}

누군가가 내가 '무엇을 설명해 주시겠습니까 잘못하고있는거야? 당신이 전혀 JTree 인스턴스를 필요로하지 않는 사실에서 Scenario1Tree 대신 JTree의 인스턴스를 생성하는 전화

setModel(new DefaultTreeModel(top)); 

에서

+3

'공용 클래스 Scenario1Tree 새로운 기능이나 오버라이드 (override) 된 추가하지 않는 한 트리를 확장하지 마십시오 JTree'을 확장합니다. 'JPanel'을 확장하지 말고 그냥 인스턴스를 유지하십시오. –

+0

먼저 JTree 데모/예제를 살펴보십시오. [YouTube] (http://www.youtube.com/watch?v=aEr4XVMVdRE) 또는 기타 [NetBeans IDE] (http://www.netbeans.org)에는 훌륭한 GUI 편집기가 있습니다. 코드를 검사하십시오. 어쩌면 이미 JTree 생성자 args로 더미 TreeModel을 사용하고 있기 때문에 이미 NetBeans를 사용하고있을 수도 있지만 루트 노드가있는 생성자를 호출 할 수도 있습니다. 이제 코드를 많이 변경해야합니다. –

+0

문제는 Java를 사용한 적이 없기 때문에 새로운 것입니다. 이 예제를 따르려고했습니다. docs.oracle.com/javase/tutorial/uiswing/components/tree.html add와 같은 클래스에서 메소드를 사용하려면 extends를 사용해야합니까? "extends tree"를 제거하면 (Scenario1Tree)를 더 이상 사용할 수 없습니다. – Matt

답변

5

.

+0

내 대답은 다른 경로로 진행됩니다. 즉, JTree를 확장해도 안되지만 (물론 내가 필요없는 곳에서는 상속을 피하는 것이 더 좋지만) 잘 될 것입니다. +1 + –

6

하나의 JTree를 너무 많이 만듭니다. 모든 노드를 JTree 변수에 추가하고 표시되는 트리에 대해 JTree 확장 클래스를 사용합니다.이 클래스의 노드에는 추가 된 노드가 없습니다.

클래스를 JTree로 확장하지 말고, 필요하면 언제 어디서나 JTree를 반환하는 getTree() 메소드를 제공하는 것이 좋습니다.

즉,

// get rid of extends JTree 
public class Scenario1Tree // extends JTree 
{ 
private static final long serialVersionUID = 1L; 

private JTree tree; 

public Scenario1Tree() 
{ 
    DefaultMutableTreeNode top = new DefaultMutableTreeNode("Scenario1"); 
    createNodes(top); 
    tree = new JTree(top); 

    tree.getSelectionModel().setSelectionMode 
     (TreeSelectionModel.SINGLE_TREE_SELECTION); 

    // JScrollPane treeView = new JScrollPane(tree); 

} 

public JTree getTree() { 
    return tree; 
} 
+0

+1 귀하의 접근 방식은 훨씬 나아졌지만 원본 코드는 조금 더 변경해야한다고 생각합니다. – StanislavL

+0

죄송합니다. 필자가 작성한 내용과 [Oracle tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html)의 차이점을 파악하는 데 어려움을 겪고 있습니다. 변수 top에 모든 노드를 만들고 예제처럼'tree = new Jtree (top) '를 정의하고 있습니다. 분명히, 나는 나의 이해에서 명백한 것을 놓치고있다. – Matt

+0

@Matt : 코드에서'extends JTree'를 제거하십시오. 거기서 시작하십시오. –