我用defaultTreeCellRender来渲染jtree的node显示,jtree的model里存的是ID,需要渲染为它的中文名(中文名和id是对应的,保存在缓存中),但是中文名可以变化. 当jtree显示在jpanel上面,同时在缓存中改变此node的中文名使其长度增加,jtree上就会显示不完全,后面的显示为"....",请问怎么样才能让node显示的中文名实时刷新?多谢多谢

解决方案 »

  1.   

    没遇到你说的问题,你多刷新几次,像update,repaint,revilidate等等,你都试试
      

  2.   

    问题是不知道某个node的中文名什么时候变化,并且中文名变化后这个node的数据还是不变的,变化的只是显示的中文名,用监听jms消息来实时刷新倒是可以,不过就是有点麻烦,现在就是想找个只改动render或jtree显示方式的办法.
      

  3.   

    正常的JTree中的节点就是一个Label,可以在Renderer中对节点的显示长度进行计算,
    通过setPreferredSize(new Dimension(x,y))来避免上面情况的出现。    tree.setCellRenderer(new 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);       
            
            int length = getLength(value);
            this.setPreferredSize(new Dimension(length,this.getHeight()));//这只是简单的实现
            return this;
          }
    //计算显示字符的长度
          public int getLength(Object value){
    ......
    return length;
    }
        });Best Regards!
      

  4.   

    像这种问题update,repaint,revilidate等方法都不会有用的,单纯的对界面进行刷新、重布局不会有任何作用
      

  5.   

    当然使用Renderer是比较麻烦的事情,如果你的Tree是通过Model实现的,你可以通过Model的reload来实现节点的重绘。reload一般需要主动触发,鉴于LZ的情况,还是建议使用Renderer实现
      

  6.   

    我现在的情况是 node中文名的改变不会影响model  向楼上说的如果用reload实现节点的重绘,还得需要监听node中文名改变的消息,然后重新绘制树,但有点复杂
      

  7.   

    上面不是还给你提供了Renderer的实现方式吗?
      

  8.   

    setPreferredSize后,如果不主动刷新这棵树,label的长度在下次刷新树之前将不会改变
      

  9.   

    你修改了节点的信息,怎么会不知道呢?
    请构造自己的TreeNode(id,name),在name修改的时候通知Model刷新就好了,绘制就交给Renderer。实在不行,把代码拿上来看看!
      

  10.   

    在render中我是这样绘制的  返回的value=treeNode.displayChineseString();
    displayChineseString()这个方法是动态显示的,显示的内容是缓存中的内容(缓存中保存这一个map,key是treeNode,value是跟treeNode对应的中文名,在key不变的情况下,value可以被其他模块任意修改)我可以监听缓存修改的消息来主动刷新jtree,但是这样有点麻烦,
    如果用render显示,是不是只能主动刷新jtree来达到显示中文名的同步??
    多谢gongfuliang的热心解答!
      

  11.   

    使用Renderer,是主动刷新就能达到名称同步的效果了在刷新的时候,如果Tree设置了Renderer,那么就会获取最新的名称,并且只刷新可见的部分
      

  12.   

    你不主动刷新也可以,只要在Renderer里面设置Label是根据ID实时去Map中取得的,那么在界面切换等刷新操作中,Label也是会更新的。或者你可以添加一个刷新的操作菜单,让用户自己去主动刷新,但是这样的感觉是不友好的
      

  13.   

    只要用render,在jtree加载时label的长度就已经确定了啊,界面切换可以实时取得要显示的内容,但label的长度不会变除非在jtree初始化时把label的长度设置到最大
      

  14.   

    在renderer中竟然你能实时接受到数据,就应该可以实时改变label的长度,就用上面提到的setPreferredSize(new Dimension(x,y)),只是要计算你需要的长度罢了.另外,如果你要实是更新,那么你就要reload()了,或者repaint().
      

  15.   

    setPreferredSize只在第一次加载jtree的时候起作用,在jtree已经加载显示在界面上之后,如果某个node要显示的中文名发生变化,这个label的长度不会自动变化,所以如果中文名长度增加就会显示“....”
      

  16.   

    刚随便写了个代码, 在下面的jtextdfield输入更多的字符,切换后,树的node就会显示不完全,出现“....”import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;import javax.swing.JFrame;
    import javax.swing.JLabel;import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.JTree;import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.TreeCellRenderer;public class TreeCellRendererTest {
    JTextField lab = new JTextField("1111"); DefaultMutableTreeNode root, client; public TreeCellRendererTest() {
    // 树
    root = new DefaultMutableTreeNode("资源管理器");
    client = new DefaultMutableTreeNode("111");
    root.add(client);
    JTree tree = new JTree(root);
    tree.setCellRenderer(new TestRenderer());
    JScrollPane sp = new JScrollPane(tree);
    JFrame f = new JFrame();
    f.getContentPane().add(sp, BorderLayout.CENTER);
    f.getContentPane().add(lab, BorderLayout.SOUTH);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(800, 300);
    f.setLocationRelativeTo(null);
    f.show();
    // TODO Auto-generated constructor stub
    } public static void main(String[] args) {
    new TreeCellRendererTest();
    } public String getTextString() {
    return lab.getText();
    } private class TestRenderer extends DefaultTreeCellRenderer implements
    TreeCellRenderer { Dimension dim = new Dimension(); JLabel l = new JLabel(); public Component getTreeCellRendererComponent(JTree tree, Object value,
    boolean selected, boolean expanded, boolean leaf, int row,
    boolean hasFocus) {

    JLabel label=new JLabel();


    String s=lab.getText();

    label.setText(s);

    return label;

    }
    }
    }
      

  17.   

    你也没有按照我说的设置Label的PreferredSize啊?!
      

  18.   

    在render里面设置也没用的,label的长度只在初次刷新树时起作用啊