如何为JTree添加空白

时间:2011-03-04 00:59:13

标签: java user-interface swing jtree

我的问题是这个

我正在尝试创建一个并排显示两棵树的组件。这两棵树通常非常相似,但可能会有一两个差异。如果存在差异,即一个分支在一个分支而不在另一个分支中,我希望没有分支的树为它显示空白空间,并为每个缺少的孩子显示空间。

所以它可能看起来像

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,并删除缺少分支的单元格。虽然这意味着垂直线的一部分也会丢失。

任何帮助,想法或评论都会非常受欢迎。感谢。

1 个答案:

答案 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);