3

我希望我的 JTree 具有可变的行高。根据我的阅读,我所要做的就是setRowHeight(0)实现一个自定义的TreeCellRenderer. 在 TreeRenderer 内部,根据项目设置了不同的边框。但是,当添加边框时,行高仍然保持不变。例如,EmptyBorder(0,0,8,0)添加 an 时,标签会移动到顶部 8 个像素。因此,树不像左侧的预期结果,而是看起来像右侧:

  EXPECTED:          RESULT:
     _                 _
  |-|_| Item 1      |-|_| Item 1
  |  _              | |_| Item 2  
  |-|_| Item 2      |-
  |                 |  _
  |  _              |-|_| Item 3
  |-|_| Item 3      

这基本上是我的代码:

JTree tree = new MyTree(root);

class MyTree extends JTree{
   public MyTree(DefaultMutableTreeNode root){
     super(root);
     setCellRenderer(new CustomCellRenderer());
     setRowHeight(0);
}

class CustomCellRenderer extends DefaultTreeCellRenderer {

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean isSelected, boolean expanded, boolean leaf, int row,
        boolean hasFocus) {

        JComponent c = (JComponent) super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
        Data d = (Data)((DefaultMutableTreeNode) value).getUserData();  
        int bttm = 0;
        if(d.isTrue()){
            bttm = 8;
        }
        c.setBorder(BorderFactory.createEmptyBorder(0, 0, bttm, 0));

        //setting size didn't show any effect either: 
        //c.setPreferredSize(new Dimension(150, 16+bttm));
        return c; 
    }

}
4

2 回答 2

2

你的假设是错误的,行高没有保持不变。行高是行的顶部和底部之间的距离,换句话说,它上面和下面的行之间的占用空间。你的草图清楚地显示了一个提高的距离,这就是真正发生的事情。

您的期望问题完全不同:您希望单元格左侧的句柄向上移动并停留在文本的中心,但句柄仍位于整个单元格的中心,包括您添加的空边框。

从 Java 7 和 BasicLookAndFeel 及其后代(如 Windows 和 Metal)开始,手柄线的垂直居中在实现中是硬编码的。

因此,如果您希望句柄保持在文本的中心,唯一可行的解​​决方案是通过在顶部和底部均等地添加空白空间来保持文本居中。

于 2013-11-21T11:21:47.917 回答
1

您可以尝试在渲染组件中使用html来获得不带BorderorsetRowHeight()或. 的效果setPreferredSize()。这是您的渲染器:

class CustomCellRenderer extends DefaultTreeCellRenderer {

        @Override
        public Component getTreeCellRendererComponent(JTree tree,Object value, boolean isSelected, boolean expanded,boolean leaf, int row, boolean hasFocus) {
            JComponent c = (JComponent) super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
            if (c instanceof JLabel) {
                ((JLabel) c).setText("<html><p style=\"padding-top: 8px;\">" + value + "<p/>");
            }
            return c;
        }

    }

在此处输入图像描述

padding-bottom取而代之padding-top 的是名称下的那种效果。

于 2013-11-21T11:35:06.753 回答