2017-10-10 13 views
0

Jtree를 구현하고 해당 노드는 "Event"객체로 초기화됩니다. Jtree를 편집 가능하게 만들고이 트리의 모델에 ModelListener를 추가합니다. 그러나이 수신기의 변경된 노드에서 getUserObject() 메서드를 사용하면 노드는 "Event"객체 대신 String 객체 만 반환합니다. 왜? getUserObject()는 부모 노드를 반환하므로 parent.getChildAt (0)를 사용하여 실제 변경된 노드를 가져 오지만 쓸모가 없습니다.DefaultMutableTreeNode getUserObject는 사용자 객체 대신 문자열 만 반환합니다.

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.event.TreeModelEvent; 
import javax.swing.event.TreeModelListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreePath; 
import java.awt.CardLayout; 
import java.awt.GridLayout; 
import java.util.List; 

import javax.swing.JScrollPane; 
import javax.swing.JTree; 

public class TreeObject extends JFrame { 

private JPanel contentPane; 
private JTree tree; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       TreeObject frame = new TreeObject(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public TreeObject() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 659, 496); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(new GridLayout(1, 0, 0, 0)); 

    JScrollPane scrollPane = new JScrollPane(); 
    contentPane.add(scrollPane); 

    tree = new JTree(); 
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("test"); 
    DefaultTreeModel model = new DefaultTreeModel(root); 
    tree.setModel(model); 
    model.addTreeModelListener(new MyModeListener()); 
    tree.setEditable(true); 
    createEvent(model); 
    scrollPane.setViewportView(tree); 
} 

public void createEvent(DefaultTreeModel model){ 
    DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
    int i = root.getChildCount(); 
    final Event event = new Event("Event"); 
    DefaultMutableTreeNode secondLevel = new DefaultMutableTreeNode(event); 
    model.insertNodeInto(secondLevel, root, root.getChildCount()); 
    tree.scrollPathToVisible(new TreePath(secondLevel.getPath())); 
    System.out.println(secondLevel.getUserObject().getClass()); 
} 

public class MyModeListener implements TreeModelListener{ 

    @Override 
    public void treeNodesChanged(TreeModelEvent arg0) { 
     DefaultMutableTreeNode node; 
     node = (DefaultMutableTreeNode)(arg0.getTreePath().getLastPathComponent()); 
     System.out.println(((DefaultMutableTreeNode) node.getChildAt(0)).getUserObject().getClass());//"WHY??" 
    } 

    @Override 
    public void treeNodesInserted(TreeModelEvent arg0) { 

    } 

    @Override 
    public void treeNodesRemoved(TreeModelEvent arg0) { 

    } 

    @Override 
    public void treeStructureChanged(TreeModelEvent arg0) { 

    } 
    } 
} 

여기 이벤트 클래스 :

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 


public class Event { 
private long ID; 
private String name; 
private String lawType; 
private Map<String,String> values = new HashMap<>(); 

public Event(String name){ 
    this.ID = System.currentTimeMillis(); 
    this.name = name; 
    addValue("Lambda", "1E-6"); 
} 

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

public void setName(String name) { 
    this.name = name; 
} 

public String getLawType() { 
    return lawType; 
} 

public void setLawType(String lawType) { 
    this.lawType = lawType; 
} 

public void addValue(String valueName,String value){ 
    this.values.put(valueName, value); 
} 

public Map<String, String> getValues() { 
    return values; 
} 

public String getName() { 
    return name; 
} 

public long getID() { 
    return ID; 
} 

} 

답변

1

당신은 루트에 문자열로 사용자 개체를 설정하는 다음은 내 코드입니다. 참조 :

DefaultMutableTreeNode root = new DefaultMutableTreeNode("test"); 
+0

예, 감사합니다. 노드에 새 텍스트를 편집하면 노드가 원본 이벤트 객체 대신 문자열이 포함되어 있다고 생각합니다. – lution