1。JAVA中树形控件中怎样更改各节点旁边显示的字符串啊?  
比如现在我  
DefaultMutableTreeNode  newNode  =  new  DefaultMutableTreeNode(obj);  
model.insertNodeInto(newNode,root,  root.getChildCount());  
 
这个Object对象如果换做是另一个类的对象,而在树形控件上的字符串我希望显示该对象的name属性,怎么办???  
 
2。如何使得加在ROOT下的所有第一层节点(暂无子节点)也具有文件夹的图标,即也变成具有字节点的节点的图标?3。DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(new ImageIcon(HpathStr+"attribute.gif"));
renderer.setClosedIcon(new ImageIcon(HpathStr+"entity.gif"));
renderer.setOpenIcon(new ImageIcon(HpathStr+"entity.gif"));
tree.setCellRenderer(renderer);这样设置节点的图标为何无效啊???????????????

解决方案 »

  1.   

    自己写一个类继承DefaultMutableTreeNode 即可如:
    public class TreeNode extends DefaultMutableTreeNode {

     
     public TreeNode(NodeInfo ni){
      super(ni.name);
              }
    }
    然后直接用你自己定义的类:TreeNode tn = new TreeNode(theNode);
      

  2.   

    增加节点时,你要根据节点的类型,比如是叶子节点还是容器节点。因此把根目录下的节点全部设成容器节点就可以了。
    public class MyTreeCellRenderer extends DefaultTreeCellRenderer
    {  public MyTreeCellRenderer()
      {
      }  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
      {
     super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);  TreeNode node = (TreeNode)value;
     
     switch(node)//判断node的类型
     {
       case 容器节点 : this.setIcon(容器节点图标);
       break;
       case 叶子节点 : this.setIcon(叶子节点图标);
       break;
    default : 
      break;
         }
     return this;
      }}
      

  3.   

    增加节点时,你要根据节点的类型,比如是叶子节点还是容器节点。因此把根目录下的节点全部设成容器节点就可以了。
    public class MyTreeCellRenderer extends DefaultTreeCellRenderer
    {  public MyTreeCellRenderer()
      {
      }  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
      {
     super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);  TreeNode node = (TreeNode)value;
     
     switch(node)//判断node的类型
     {
       case 容器节点 : this.setIcon(容器节点图标);
       break;
       case 叶子节点 : this.setIcon(叶子节点图标);
       break;
    default : 
      break;
         }
     return this;
      }}
      

  4.   

    你好,我这样使用
    EntityTreeNode entityNode = (EntityTreeNode)findUserObject(entity);
    AttributeTreeNode attributeNode = new AttributeTreeNode(attribute);
    model.insertNodeInto(attributeNode,entityNode,entityNode.getChildCount());
    然后在最后一句那java.lang.NullPointerException啊!!
      

  5.   

    class MyTreeCellRenderer extends DefaultTreeCellRenderer
    {
    private URL HcodeBase;
    private String HpathStr;

    public MyTreeCellRenderer(){}

    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
    {
    super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus); try
    {
    HcodeBase=new URL("file:"+System.getProperty("user.dir") +"/");
    }
    catch(Exception e){}
        HpathStr=HcodeBase.toString();
        HpathStr=HpathStr.substring(5,HpathStr.length());
        
    TreeNode node = (TreeNode)value;
     
    if (value.getClass().getSimpleName().equals("EntityTreeNode"))//判断node的类型
    {
    this.setIcon(new ImageIcon(HpathStr+"entity.gif"));
    }
    else
    {
    this.setIcon(new ImageIcon(HpathStr+"attribute.gif"));
    }

    return this;
    }
    }MyTreeCellRenderer myTreeCellRenderer = new MyTreeCellRenderer();
    tree.setCellRenderer(myTreeCellRenderer);我这样图标还是不变啊!
      

  6.   

    你调试一下,你可以直接将节点类型封装在类TreeNode中
    然后
    TreeNode node = (TreeNode)value;
    if(node.id == 0)//id==0表示容器节点
    {
      this.setIcon(...);
    }
    else
    {
      this.setIcon(...);
    }
      

  7.   

    将节点类型封装在类TreeNode中?
    怎么弄?
      

  8.   

    public void addAttribute(Object entity,Object attribute)
    {
    EntityTreeNode entityNode1 = (EntityTreeNode)findUserObject(entity);
    AttributeTreeNode attributeNode = new AttributeTreeNode((ERAttribute)attribute);
    if (entityNode1 == null)
    System.out.println("vsad!");
    model.insertNodeInto(attributeNode,entityNode1,entityNode1.getChildCount());

    TreeNode[] nodes = model.getPathToRoot(entityNode1);
    TreePath path = new TreePath(nodes);
    tree.scrollPathToVisible(path);
    }这儿输出vsad!
    说明是findUserObject找不到parent节点啊!
      

  9.   

    1。你的fire方法我没看见
    2。另外你用判断节点属于哪个class的方法不可取
    如果有多种节点类型岂不是会有多个类,不如写成这样:
    public class MyTreeNode extends DefaultMutableTreeNode {

     int type;
     
     public TreeNode(NodeInfo ni){
      super(Utility.toCN(ni.name));
      this.type= ni.type;
     }
     
    }
    然后在下面的类中直接判断Node的类型即可
    public class MyTreeCellRenderer extends DefaultTreeCellRenderer
    {  public MyTreeCellRenderer()
      {
      }  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
      {
     super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);  MyTreeNode node = (MyTreeNode )value;
     
     switch(node.type)
     {
       case Entity: this.setIcon(...);
       break;
       case Attribute: this.setIcon(...);
       break;
       default : break;
         }
     return this;
      }}
      

  10.   

    大哥我还是传点完整的给你你可以运行运行你就知道奇怪了图标更本换不了
    JTree插入节点后也无法自动刷新已发到你邮箱!
      

  11.   

    我已经稍微做了改动,发回你的邮箱了JTree的自动更新需要调用updateUI();
      

  12.   

    updateUI();我试过了没用啊!你改过的程序还是插入时不能更改啊!而且MyTreeNode node = (MyTreeNode)value;运行
    Exception in thread "main" java.lang.ClassCastException:!!!!!