我现在写的程序有些问题,请帮我看看,怎么解决super("即时通信"); // 调用父类构造函数
DefaultMutableTreeNode root = new DefaultMutableTreeNode("企业通信"); // 生成根节点
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("自己"); //
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的好友"); //
root.add(node1); // 增加节点一到根节点上
root.add(node2);
node1.add(new DefaultMutableTreeNode("乔治.巴顿"));
node2.add(new DefaultMutableTreeNode("巴乔"));
// node2.add(new DefaultMutableTreeNode(""));
node2.add(new DefaultMutableTreeNode("温柔一刀"));
JTree tree = new JTree(root); // 得到JTree的实例
DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
.getCellRenderer(); // 得到JTree的Renderer
ImageIcon ii;
ImageIcon ii1;
ImageIcon ii2;
ii = new ImageIcon("e:/images/open.png");
ii1 = new ImageIcon("e:/images/close.png");
ii2 = new ImageIcon("e:/images/1.gif");
renderer.setLeafIcon(ii2); // 设置叶子节点图标为空
renderer.setClosedIcon(ii1); // 设置关闭节点的图标为空
renderer.setOpenIcon(ii); // 设置打开节点的图标为空
tree.setRootVisible(false);
tree.putClientProperty("JTree.lineStyle", "None");

                  tree.setRowHeight(ii2.getIconHeight() + 6);
                  

请看红色代码部分,如果不除掉这段代码,运行效果见中间图片;但是根目录(“自己”,“我的好友”)这2个目录间隙太大了。我希望这2个目录尽量靠拢,像最左边那样。
如果除掉红色部分
运行效果就是第一个样式,我的2个好友之间的头像没有任何间隙了,我希望,头像之间有一些间隙。
总之
我希望,运行效果类似qq一样,我的好友头像之间需要有间隙,但是,目录之间间隙尽量小一点,不知道怎么做哦?

解决方案 »

  1.   

    能不能设置头像的行高嘛
    没做过java这方面的东西
      

  2.   

    自定义渲染器就搞定了,楼主可以参考一下下面的例子,本来只需要用leaf判断就行了,但是QQ组下面可能没有一个好友,也就是没有一个子节点,那QQ组就是叶节点了,当然不行,所以只能用距离根节点的层级来判断,楼主可以根据自己的情况修改一下。import javax.swing.*;
    import javax.swing.tree.*;
    import java.awt.*;public class TreeTest {
    public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(800, 600);
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("企业通信");
    DefaultMutableTreeNode group1 = new DefaultMutableTreeNode("自己");
    DefaultMutableTreeNode group2 = new DefaultMutableTreeNode("我的好友");
    DefaultMutableTreeNode person1 = new DefaultMutableTreeNode("乔治.巴顿");
    DefaultMutableTreeNode person2 = new DefaultMutableTreeNode("温柔一刀");
    root.add(group1);
    root.add(group2);
    group2.add(person1);
    group2.add(person2);
    JTree tree = new JTree(root);
    tree.setRootVisible(false);
    tree.setCellRenderer(new MyTreeCellRenderer());
    frame.add(tree);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }class MyTreeCellRenderer extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
    boolean expanded, boolean leaf, int row, boolean hasFocus) {
    if (value instanceof DefaultMutableTreeNode) {
    setPreferredSize(new Dimension(100, ((DefaultMutableTreeNode)value).getLevel() == 1 ? 20 : 50));
    }
    return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    }
    }
      

  3.   

    做不到,标题栏的字体无法修改,能修改的只有窗体内部控件的字体。当然,也不是完全没有办法,不过成本太高,就是setUndecorated(true),然后标题栏完全重新绘制,这个工程量太大,因为这么做了以后,拖动窗口、拉动窗口大小等很多默认功能都没有了,如果楼主是要学习的话,标题栏完全重新绘制对理解Swing和绘图API还是很有帮助的,做项目就算了,之前我在公司就做了一个,费了好多劲。最后问一下楼主这个有点仿Mac的外观风格是哪弄来的?
      

  4.   


    我从http://www.randelshofer.ch/quaqua/ 这里下载了一个东西的
      

  5.   

    晕,这是苹果的外观风格,苹果的界面漂亮是出了名的,其实你只要运用苹果的外观,在MAC系统上运行,很多东西根本就不用你来管,如果可能,你可以自定义一套自己的外观风格,但这比setUndecorated(true),然后自己画的成本还要高得多,你必须为每个组件定义外观,别说个人,就是公司也没几个这么干的。很多人说Swing做的东西太丑,只是Swing的默认外观太丑而已,而且自定义一套外观的成本太高,大部分人不懂,他们只会用默认外观,潜意识里面自然就觉得Swing太丑,其实在MAC系统上Swing的外观很漂亮的。