用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;
}
------解决方案--------------------------------------------------------
只要不阻塞event-dispatching thread就行