Java DefaultMutableTreeNode getUserObject仅返回字符串,而不是用户对象

Java DefaultMutableTreeNode getUserObject仅返回字符串,而不是用户对象,java,swing,user-interface,jtree,Java,Swing,User Interface,Jtree,我实现了一个Jtree,它的节点由“Event”对象初始化。我使Jtree可编辑,并将ModelListener添加到此树的模型中。但是,当我在此侦听器中对更改的节点使用getUserObject()方法时,该节点只返回一个String对象,而不是“Event”对象。为什么? 我知道getUserObject()返回父节点,所以我使用parent.getChildAt(0)来获取真正更改的节点,但它没有用。 这是我的密码: import java.awt.BorderLayout; import

我实现了一个Jtree,它的节点由“Event”对象初始化。我使Jtree可编辑,并将ModelListener添加到此树的模型中。但是,当我在此侦听器中对更改的节点使用getUserObject()方法时,该节点只返回一个String对象,而不是“Event”对象。为什么? 我知道getUserObject()返回父节点,所以我使用parent.getChildAt(0)来获取真正更改的节点,但它没有用。 这是我的密码:

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;
 }

}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公开课活动{
私人长ID;
私有字符串名称;
私有字符串类型;
私有映射值=新的HashMap();
公共事件(字符串名称){
this.ID=System.currentTimeMillis();
this.name=名称;
附加值(“λ”、“1E-6”);
}
@凌驾
公共字符串toString(){
返回此.name;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getLawType(){
返回型;
}
公共无效setLawType(字符串lawType){
this.lawType=lawType;
}
public void addValue(字符串值名称、字符串值){
this.values.put(valueName,value);
}
公共映射getValues(){
返回值;
}
公共字符串getName(){
返回名称;
}
公共长getID(){
返回ID;
}
}

您正在将用户对象设置为根目录中的字符串。见:

DefaultMutableTreeNode root = new DefaultMutableTreeNode("test");

是的,谢谢。我认为当我编辑一个新的文本到节点时,节点包含的是字符串而不是原始事件对象!!