JTree:可变行高
Posted
技术标签:
【中文标题】JTree:可变行高【英文标题】:JTree: variable row height 【发布时间】:2013-11-21 10:39:04 【问题描述】:我希望我的 JTree 具有可变的行高。根据我的阅读,我所要做的就是setRowHeight(0)
并实现一个自定义TreeCellRenderer
。在 TreeRenderer 内部,根据项目设置了不同的边框。但是,当添加边框时,行高仍然保持不变。例如,当添加EmptyBorder(0,0,8,0)
时,标签会移动到顶部 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;
【问题讨论】:
@Holger 已经提到:水平线始终相对于节点的高度居中,您无能为力。好奇你为什么想要它? 【参考方案1】:你的假设是错误的,行高没有保持不变。行高是行的顶部和底部之间的距离,换句话说,它上面和下面的行之间的占用空间。你的草图清楚地显示了一个增加的距离,这就是真正发生的事情。
您的期望问题完全不同:您希望单元格左侧的 句柄 向上移动并保持在文本的中心,但句柄仍保持在整个文本的中心单元格,包括您添加的空白边框。
从 Java 7 和 BasicLookAndFeel 及其后代(如 Windows 和 Metal)开始,手柄线的垂直居中在实现中是硬编码的。
因此,如果您希望句柄保持在文本的中心,唯一可行的解决方案是通过在顶部和底部添加空白空间来保持文本居中。
【讨论】:
【参考方案2】:您可以尝试在渲染组件中使用 html 来获得该效果,而无需 Border
或 setRowHeight()
或 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
用于名称下的效果。
【讨论】:
以上是关于JTree:可变行高的主要内容,如果未能解决你的问题,请参考以下文章