我希望我的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;
}
}
答案 0 :(得分:2)
你的假设是错误的,行高不会保持不变。行高是行的顶部和底部之间的距离,换言之,行之上和之下的行之间的占用空间。你的草图清楚地显示了一个凸起的距离,这才是真正发生的事情。
您期望的问题完全不同:您希望单元格左侧的句柄向上移动,保持在文本的中心,但句柄仍然是整个文本的中心单元格,包括您添加的空边框。
从Java 7和BasicLookAndFeel及其后代(如Windows和Metal)开始,句柄行的垂直居中在实现中是硬编码的。
因此,如果您希望句柄保持在文本的中心,唯一可行的解决方案是通过将空白空间平均添加到顶部和底部来保持文本居中。
答案 1 :(得分:1)
您可以尝试在呈现的组件中使用 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
代表该名称。