用JTREE做了个模仿QQ的好友列表,多数情况下正常,但有时加载 单元格大小会变化,格子的高度不一致。重写了DefaultTreeCellRenderer下面的方法。帮我看看是怎么回事吧。
         @Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, leaf, expanded,
leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
// 获取单元格绑定的数据对象
Object userObj = node.getUserObject();
StringBuilder tooltip = new StringBuilder(); // 设置单元格大小
                  // setSize(60,20);  无效******************************* // 针对用户分组的节点
if (!(userObj instanceof User)) {
setBackgroundSelectionColor(Color.white);
setForeground(Color.blue);
// 该分组下没人
if (leaf) {
setIcon(UIManager.getIcon("Tree.closedIcon"));
}
} // 针对关系户的节点
else if (userObj instanceof User) {
User tempUser = (User) userObj;
// 根据用户状态设置图标
javax.swing.ImageIcon icon = new javax.swing.ImageIcon(
"res" + File.separator + "head" + File.separator + tempUser.getHead());
if (tempUser.getStatus() == PubValue.ONLINE) {
setIcon(icon);
} else if (tempUser.getStatus() == PubValue.DOWNLINE) {
BufferedImage image = new BufferedImage(
icon.getIconWidth(), icon.getIconHeight(),
BufferedImage.TYPE_BYTE_GRAY);
Graphics g = image.getGraphics();
g.drawImage(icon.getImage(), 0, 0, null);
g.dispose();
setIcon(new javax.swing.ImageIcon(image));
}
// 设置单元格文本
setText(tempUser.getName());
tooltip
.append("<html><div style='width:100px;height:80px;border:1px solid black'>");
tooltip.append("姓名: ");
tooltip.append(tempUser.getUid());
tooltip.append("<br/>性别:");
tooltip.append(tempUser.getSex());
tooltip.append("<br/>年龄:");
tooltip.append(tempUser.getAge());
tooltip.append("<hr/>");
tooltip.append(tempUser.getDescription());
tooltip.append("</div></html>");
setToolTipText(tooltip.toString());
setBackgroundSelectionColor(Color.white);
}
// 针对所有节点
setToolTipText(tooltip.toString());
// 设置单元格边框(控制节点间距)
setBorder(BorderFactory.createMatteBorder(1, 0, 8, 1, Color.white));
// setBorderSelectionColor(Color.white); return this;
}

解决方案 »

  1.   

    我是用另一个线程给JTREE加载的数据。会不会影响它的图像绘制?
      

  2.   

    只要不阻塞event-dispatching thread就行
      

  3.   

    没有阻塞啊。JTREE先显示出来后再往里添加节点就容易出这个问题。
      

  4.   

    JTREE bu cuo di dongxi 
      

  5.   

    我做过一个山寨QQ,你可以看下。
    /**
     * QQ主界面
     * */
    public class QQClientMain extends JFrame {
    // 定义北部需要的组件
    private JLabel jbl1_jbl1, jbl1_jbl2;
    private JComboBox jcb1;
    private JTextField jtf1;
    private ImageIcon icon;

    // 中部需要的组件
    private JTabbedPane jtp1;
    private JPanel jtp1_jpl1, jtp1_jpl2, jpt1_jpl3;
    private JTree jpt1_tree1, jpt1_tree2;
    // private DefaultTreeModel tree1_treeModel, tree2_treeModel;
    private JScrollPane jpt1_jsp1, jpt1_jsp2;


    public QQClientMain() {

    initNorth();
    initCenter();

    this.setLayout(null);
    this.setSize(260,520);
    this.setResizable(false);
    // 添加窗口的关闭事件
    this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent arg0) {
    System.exit(0);
    }
    });
    this.setIconImage((new ImageIcon("image/头像.gif").getImage()));
    this.setTitle("QQ2012");
    this.setVisible(true);
    }

    // 初始化北部(头像显示、状态下拉框、昵称、搜索栏)
    public void initNorth() {
    // 头像显示
    Image image = getToolkit().getImage("image/qqImg1.jpg");
    image = image.getScaledInstance(100, 100, image.SCALE_DEFAULT);
    icon = new ImageIcon(image);
    jbl1_jbl1 = new JLabel();
    jbl1_jbl1.setIcon(icon);
    jbl1_jbl1.setBounds(10, 10, 100, 100);
    this.add(jbl1_jbl1); // 下拉框显示
    String []state = {"隐身","在线"};
    jcb1 = new JComboBox(state);
    jcb1.setBounds(120, 10, 60, 20);
    this.add(jcb1);

    // 昵称显示
    jbl1_jbl2 = new JLabel();
    jbl1_jbl2.setText("飞翔的企鹅");
    jbl1_jbl2.setBounds(120, 50, 130, 30);
    this.add(jbl1_jbl2);

    // 搜索栏显示
    jtf1 = new JTextField();
    jtf1.setBounds(10, 120, 235, 30);
    this.add(jtf1);
    }

    // 初始化中部(好友列表和群列表的显示)
    public void initCenter() {
    // 初始化好友列表
    DefaultMutableTreeNode root = new DefaultMutableTreeNode(new TreeNode("0","好友列表"));
    // 一级节点
    DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(new TreeNode("1","我的好友"));
    DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(new TreeNode("2","陌生人"));
    DefaultMutableTreeNode node3 = new DefaultMutableTreeNode(new TreeNode("3","黑名单"));

    // 子节点
    // 好友
    DefaultMutableTreeNode node1_1 = new DefaultMutableTreeNode(new TreeNode("100","张三","image/1-1.gif"));
    DefaultMutableTreeNode node1_2 = new DefaultMutableTreeNode(new TreeNode("400","李四","image/2-1.gif"));
    DefaultMutableTreeNode node1_3 = new DefaultMutableTreeNode(new TreeNode("200","王五","image/3-1.gif"));
    DefaultMutableTreeNode node1_4 = new DefaultMutableTreeNode(new TreeNode("600","李流","image/4-1.gif"));
    DefaultMutableTreeNode node1_5 = new DefaultMutableTreeNode(new TreeNode("800","黄山","image/5-1.gif"));
    DefaultMutableTreeNode node1_6 = new DefaultMutableTreeNode(new TreeNode("1400","武当","image/6-1.gif"));
    DefaultMutableTreeNode node1_7 = new DefaultMutableTreeNode(new TreeNode("4700","太极","image/7-1.gif"));
    DefaultMutableTreeNode node1_8 = new DefaultMutableTreeNode(new TreeNode("4700","太极","image/8-1.gif"));
    DefaultMutableTreeNode node1_9 = new DefaultMutableTreeNode(new TreeNode("2500","万里晴空","image/9-1.gif"));
    DefaultMutableTreeNode node1_10 = new DefaultMutableTreeNode(new TreeNode("7600","漂泊大雨","image/5-1.gif"));
    DefaultMutableTreeNode node1_11 = new DefaultMutableTreeNode(new TreeNode("8700","更上一层楼","image/6-1.gif"));
    // 陌生人
    DefaultMutableTreeNode node2_1 = new DefaultMutableTreeNode(new TreeNode("1300","张三","image/4-1.gif"));
    DefaultMutableTreeNode node2_2 = new DefaultMutableTreeNode(new TreeNode("4050","张三","image/7-1.gif"));
    DefaultMutableTreeNode node2_3 = new DefaultMutableTreeNode(new TreeNode("2700","张三","image/1-1.gif"));
    DefaultMutableTreeNode node2_4 = new DefaultMutableTreeNode(new TreeNode("6800","张三","image/3-1.gif"));
    DefaultMutableTreeNode node2_5 = new DefaultMutableTreeNode(new TreeNode("890","张三","image/7-1.gif"));
    // 黑名单
    DefaultMutableTreeNode node3_1 = new DefaultMutableTreeNode(new TreeNode("1010","张三","image/2-1.gif"));
    DefaultMutableTreeNode node3_2 = new DefaultMutableTreeNode(new TreeNode("4400","张三","image/5-1.gif"));
    DefaultMutableTreeNode node3_3 = new DefaultMutableTreeNode(new TreeNode("20440","张三","image/8-1.gif"));
    DefaultMutableTreeNode node3_4 = new DefaultMutableTreeNode(new TreeNode("6500","张三","image/6-1.gif"));
    DefaultMutableTreeNode node3_5 = new DefaultMutableTreeNode(new TreeNode("8070","张三","image/4-1.gif"));

    jpt1_tree1 = new JTree(root);
    jpt1_tree1.setCellRenderer(new MyCellRenderer());
    // jpt1_tree1.setRootVisible(false);
    jpt1_jsp1 = new JScrollPane(jpt1_tree1);
    // 设置单击展开树节点
    jpt1_tree1.setToggleClickCount(1);

    root.add(node1);
    root.add(node2);
    root.add(node3);

    node1.add(node1_1);
    node1.add(node1_2);
    node1.add(node1_3);
    node1.add(node1_4);
    node1.add(node1_5);
    node1.add(node1_6);
    node1.add(node1_7);
    node1.add(node1_8);
    node1.add(node1_9);
    node1.add(node1_10);
    node1.add(node1_11); node2.add(node2_1);
    node2.add(node2_2);
    node2.add(node2_3);
    node2.add(node2_4);
    node2.add(node2_5);

    node3.add(node3_1);
    node3.add(node3_2);
    node3.add(node3_3);
    node3.add(node3_4);
    node3.add(node3_5);


    // 创建选项卡窗口
    jtp1 = new JTabbedPane(JTabbedPane.TOP);
    // 选项卡一:好友列表

    jtp1_jpl1 = new JPanel(new BorderLayout());
    jtp1_jpl1.add(jpt1_jsp1, "Center");

    jtp1_jpl2 = new JPanel();
    jpt1_jpl3 = new JPanel();

    jtp1.add(jtp1_jpl1, "联系人");
    jtp1.add(jtp1_jpl2, "群");
    jtp1.add(jpt1_jpl3, "最近联系人");

    jtp1.setBounds(10, 160, 235, 280);
    this.add(jtp1);


    }


    class MyCellRenderer extends DefaultTreeCellRenderer {
    @Override
    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);

    // 获得节点对象
    DefaultMutableTreeNode node = (DefaultMutableTreeNode)value; 
    TreeNode treeNode = (TreeNode) node.getUserObject();
    String id = treeNode.getId();
    String nickname = treeNode.getValue();
    String image = treeNode.getImage(); // 设置节点显示内容
    this.setText(nickname);


    // 设置叶节点的图标
    if(leaf && image != null) {
    setLeafIcon(new ImageIcon(image));
    }
    // // 设置展开的节点的图标
    // if(expanded) {
    // setOpenIcon(new ImageIcon("image/openFloder.jpg"));
    // }
    // else {
    // setClosedIcon(new ImageIcon("image/closeFloder.jpg"));
    // }
    return this;
    }
    }

    public static void main(String[] args) {
    new QQClientMain();
    }
    }