class MyClass
{
  String strValue;  
  void setValue(String str)
  {
    strValue = str;
  }  String toString()
  {
    return strValue;
  }
}
树图上的节点挂接的就是MyClassDefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) tree.getSelectionPath(). getLastPathComponent();
MyClass myClass = (MyClass)treeNode.getUserObject(); 
myClass.setValue("aaaaaaaaaaaaaaaaaa");这个时候就改变了它在树图上的显示的文字就发生了改变。
就出现了上面的现象!!!

解决方案 »

  1.   

    你可以这样写:
    class MyClass{
       private Object value;
       
       void setValue(Object o){
           this.value=o;
       }
       
       public Object getValue()
       {
           return value;
       }
       
       public String toString(Object o)
       {
           return o.toString();
       }
    }
      

  2.   

    你要求的是不是需要换行?这个比较麻烦,需要写一个TreeCellRenderer,
    缺省的TreeCellRenderer内部是一个JLabel,字符串长了就会出现...
    需要将其实现为一个可以换行的Component,比如JTextField
      

  3.   

    给你一段,未另写程序测试,不能保证能解决你的问题,呵呵下面的方式是一种比较好扩展的做法。1.
    你的MyClass实现一个getText()方法先。2.自己写一个CellRenderer
    class MyTreeCellRenderer extends DefaultTreeCellRenderer{
      public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                      boolean selected,
                                                      boolean expanded,
                                                      boolean leaf, int row,
                                                      boolean hasFocus){
          DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
          //判断是否是MyClass类型的
          if (node instanceof MyClass) {
            setText(((MyClass)node).getText());
            //当你的MyClass实现一个取图标的方法,这里也可以定制图标了。
            //setIcon(...);
            //...
          }
          else {
            setText(node.getUserObject().toString());
          }
          if (selected) {
            setForeground(Color.white);
          }
          else {
            setForeground(Color.black);
          }
          this.selected = selected;
          this.hasFocus = hasFocus;
          return this;
        }    //覆盖paintComponent方法,想啥画就啥画...
        public void paintComponent(Graphics g) {
            //先根据selected状况画选中和非选中背景
            //再getText()取得要画的字符串,getIcon取得图标,画之
           //.........
        }     //覆盖下面的方法,设置长度,出不出现...就靠它了
        public Dimension getPreferredSize() {
          //这里根据getText()的字符串宽度和icon的宽度计算吧
          //.....
        }
    }3.在设置Tree的类里:
    myTree.setCellRenderer(new MyTreeCellRenderer());差不多了就这样了.咱是同道啊,多多交流,呵呵。
      

  4.   

    我也遇到同样的问题,楼上的实现的只是树节点的显示.如果要实现编辑是要实现TreeCellEditor的,
    这才是用于树中节点的编辑.关注
      

  5.   

    搞定:
    ((DefaultTreeModel)tree.getModel()).nodeChanged(newNode);