用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;
}
@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;
}
/**
* 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();
}
}