请大家帮忙一个关于jTree的问题。
我用jTree来显示一个设备的结构,jTree的每个节点的数据基本上是这种结构[01-01],[01-02],[01-03],....
现在我遇到的问题是,有时候画这个tree 不能完整的显示出来,比如,某个结点它显示成[01..., 
也就是后面的数字和]变成了省略号,特别困难的是,这个问题不是每次都重现,基本上
是100次碰上一次,而且每次画不完整的节点都不一样。不知道大家又没有碰到过类似的问题,
又是怎么解决的?非常感谢大家的帮忙,因为工程是一个商业软件,头儿非要我解决这个问题,
因为很难重现,所以我基本上是没有什么办法。

解决方案 »

  1.   

    你可以试试把这棵树直接放到一个单独的面板中去show出来看看。
      

  2.   

    实际上每个节点是一个Label,实现自己的Renderer,在Renderer中计算 文本的宽度,通过setPreferredSize来分配Label的宽度。你的节点的Text有可能会被改变吗?如果改变的话,还需要调用model的 reload(),避免上面的问题
      

  3.   

    实际上每个节点是一个Label,实现自己的Renderer,在Renderer中计算 文本的宽度,通过setPreferredSize来分配Label的宽度。但是要注意组件的Insets,不能直接使用Text文本的宽度作为Renderer的宽度你的节点的Text有可能会被改变吗?如果改变的话,还需要调用model的 reload(),避免上面的问题
      

  4.   

    下面是我们code里面实现的自己的IconNodeRenderer.只是重载了一个函数。
    实际上,每个节点既有图标,也有字符串。结点的字符串还可能会修改,
    10楼的大师说要计算字符串的宽度,应该怎么做呀?能不能提供一点code参考一下?
    拜谢了!class IconNodeRenderer extends DefaultTreeCellRenderer {  public Component getTreeCellRendererComponent(JTree tree, Object value,
          boolean sel, boolean expanded, boolean leaf, int row,
          boolean hasFocus) {    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
            row, hasFocus);    Icon icon = ((IconNode) value).getIcon();    if (icon == null) {
          Hashtable icons = (Hashtable) tree.getClientProperty("JTree.icons");
          String name = ((IconNode) value).getIconName();
          if ((icons != null) && (name != null)) {
            icon = (Icon) icons.get(name);
            if (icon != null) {
              setIcon(icon);
            }
          }
        } else {
          setIcon(icon);
        }    return this;
      }
    }
      

  5.   


    实际上来说,节点的宽度在展现的时候已经都计算好了,能够完整的展现。
    因为你的节点的Text可能会变化,但是这时候节点的当前大小并不会重新设置,那么你需要在节点Text变化的时候,调用model.reload()  ————DefaultTableModel中的方法比如你接受到一个节点改变的消息,应该是通过model进行处理的吧:
    model......;//处理节点
    model.reload();//重要至于setPreferredSize,基本上没什么大的作用,只是为了保险一些。
    FontMetrics ms = getFontMetrics(getFont());
    int width = ms.stringWidth(getText()) + getInsets().left + getInsets().right + 图片宽度;
    setPreferredSize(new Dimension(width,getHeight()));
      

  6.   

    非常感谢楼上的详细解答。不过,我们这棵树说起来,似乎应该没有你说的问题,每次节点有点变化的时候,整棵树都是
    重新开始建的。也就是说数的model都是重新来一遍的。代码如下:
     public void initTreeView(){
            
            int index = m_frm.m_rfb.getOSDListMode();
            String treeLabel = "";
            jComboBoxViewSelection.setSelectedIndex(index);        
            
            synchronized(m_frm.m_rfb.m_iCard.PortName) {        
            
            iCardTreeNode data = new iCardTreeNode("root",255,255);
            root = new IconNode(data);          
            int count = 0 ;
           for(int j=0 ; j<16 ; j++)
    {
                if(m_frm.m_rfb.m_iCard.portNo[j]==0) break ;
                if(m_frm.m_rfb.m_iCard.portNo[j]>0 && m_frm.m_rfb.m_iCard.portNo[j] <= 16)
                { 
                    Formatter fmt = new Formatter();  
                    fmt.format("[%02d-%02d]",j+1,m_frm.m_rfb.m_iCard.portNo[j]) ;
                    data = new iCardTreeNode(fmt.toString(),j,255);
                    IconNode node = new IconNode(data) ;
                    node.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/root1.gif")));                count ++ ;
    for(int i=0; i <m_frm.m_rfb.m_iCard.portNo[j];i++)
    {
                        if(isItemWanted(j,i))
    {                 
                              
                            String pn = "" ;
    //                        synchronized(m_frm.m_rfb.m_iCard.PortName) {
                                pn = String.format("%-12.12s",m_frm.m_rfb.m_iCard.PortName[j][i]);
    //                        }
                              if(pn.length()>12)
                                    pn="portname>12" ;
                              treeLabel = String.format("[%02d-%02d]              %-12.12s",j+1,i+1,pn) ;  
                              if(treeLabel.length()>33)
                                  treeLabel = treeLabel.substring(0,33);
                              
                              data = new iCardTreeNode(treeLabel,j,i);
                              IconNode node1 = new IconNode(data) ;
                              if(m_frm.m_rfb.getPowerStatus(j,i)==1)
                              {
                                  if(m_frm.m_rfb.getQuickViewStatus(j,i)==1)
                                  {
                                      node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/quickview.gif")));
                                  }
                                  else
                                  {
                                      node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/poweron2.gif")));
                                  }
                              }
                              else
                              {
                                  if(m_frm.m_rfb.getQuickViewStatus(j,i)==1)
                                  {
                                      node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/quickviewoff.gif")));
                                  }
                                  else
                                  {
                                      node1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/poweroff.gif")));
                                  }                            
                              }
                              node.add((IconNode)node1);
                            }
                    }
                    root.add((IconNode)node);
                 }
            }
           TreeModel treeModel = new DefaultTreeModel(root);
           
           jTree1.setModel(treeModel);
           
           IconNodeRenderer renderer = new IconNodeRenderer() ;  
        
           jTree1.setCellRenderer(renderer) ;   
           jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);   
             
            
           TreeCellEditor textEditor =  getTreeCellEditor();
         ditor = new DefaultTreeCellEditor(jTree1, renderer, textEditor);
            jTree1.setCellEditor(editor);      
           
           jTree1.setEditable(true);
           jTree1.requestFocus();
            }     
       }不管怎么样,回去先试试你提供的办法,明天来给你加分。非常感谢