我的问题是这个
我正在尝试创建一个并排显示两棵树的组件。这两棵树通常非常相似,但可能会有一两个差异。如果存在差异,即一个分支在一个分支而不在另一个分支中,我希望没有分支的树为它显示空白空间,并为每个缺少的孩子显示空间。
所以它可能看起来像
left tree right tree ------------ ------------- + Root + Root | | --Child A --Child A | | --Child B | | | --Child C --Child C
使用自定义渲染器删除那些应该是间隙的行的文本和图标相对简单。但是,这仍然留下将孩子连接到父母垂直线的水平线。这是我的问题。
left tree right tree ------------ ------------- + Root + Root | | --Child A --Child A | | --Child B -- <--I want to remove this | | --Child C --Child C
在这个简单的例子中它可能是不可能的,但是当缺少的分支也有孩子时,我最终会有许多小线连接间隙。
我认为一个潜在的替代方案是为每个树创建一个列JTreeTable,并删除缺少分支的单元格。虽然这意味着垂直线的一部分也会丢失。
任何帮助,想法或评论都会非常受欢迎。感谢。
答案 0 :(得分:3)
请考虑以下事项:
class ReticentTreeUI extends BasicTreeUI {
private Set<Integer> hiddenRows = new HashSet<Integer>();
public void hideRow(int row) {
hiddenRows.add(row);
}
@Override
protected void paintHorizontalPartOfLeg(Graphics g,
Rectangle clipBounds, Insets insets, Rectangle bounds,
TreePath path, int row, boolean isExpanded,
boolean hasBeenExpanded, boolean isLeaf) {
if (!hiddenRows.contains(row)) {
super.paintHorizontalPartOfLeg(g, clipBounds, insets, bounds,
path, row, isExpanded, hasBeenExpanded, isLeaf);
}
}
@Override
protected void paintRow(Graphics g, Rectangle clipBounds,
Insets insets, Rectangle bounds, TreePath path, int row,
boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
if (!hiddenRows.contains(row)) {
super.paintRow(g, clipBounds, insets, bounds, path, row,
isExpanded, hasBeenExpanded, isLeaf);
}
}
@Override
protected void paintExpandControl(Graphics g, Rectangle clipBounds,
Insets insets, Rectangle bounds, TreePath path, int row,
boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
if (!hiddenRows.contains(row)) {
super.paintExpandControl(g, clipBounds, insets, bounds,
path, row, isExpanded, hasBeenExpanded, isLeaf);
}
}
}
用法示例:
JTree tree = new JTree();
ReticentTreeUI ui = new ReticentTreeUI();
tree.setUI(ui);
ui.hideRow(2);