Я хочу, чтобы мой JTree имел переменную высоту строки. Из того, что я прочитал, все, что мне нужно сделать, это setRowHeight(0)
и реализовать пользовательский TreeCellRenderer
. Внутри TreeRenderer установлены разные границы, в зависимости от элемента. однако при добавлении границы высота строки остается неизменной. Например, когда добавляется EmptyBorder(0,0,8,0)
, метка перемещается вверх на 8 пикселей. Таким образом, вместо ожидаемого результата на левой стороне, дерево выглядит как на правом:JTree: переменная высота строки
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: горизонтальная линия всегда центрирована относительно высоты узла, и вы ничего не можете с этим поделать. Любопытно, зачем вам это нужно? – kleopatra