获取不在视口中的JTree节点的行或TreePath

时间:2010-12-19 05:37:32

标签: jscrollpane jtree

我有一个JTree和一个自定义渲染器。

JTree是一个由交换机和端口号组成的IP地址树。

我有一个ip地址图。

当用户点击图表行时,我尝试更新JTree以显示用户选择的行。

如果用户鼠标在图表中选择了ip,则渲染器包含该节点,并且因为行和TreePath可用,所以很容易发生其他操作。

如果ip的列表很大而且有些滚动到视口之外,我在查找我要选择并在视口中显示的对象/ ip的行或treenode时遇到问题。

我在JTree中有一个ActionEvent,它从getUserObject()返回一些构成节点文本的文本。

我不知道如何找到行或TreeNode。如果我能找到它们,我可以检查行是否可见,如果没有调用makeVisible(treePath) - 或者使用scrollPane.getViewport()。getViewRect()并将其与treeNode的rect进行比较。

感谢您的任何提示或方向...... 吉姆

2 个答案:

答案 0 :(得分:0)

我用以下方式解决了这个问题。

扩展所有节点后,我填充了一个以ip为键,行为值的hashmap。

当我收到包含ip的事件时,我会在hasmap中查找该行。

这适用于节点/行是否在视口中。

如下:

        if ( ipRowMap.containsKey( ip )) {
            row = ipRowMap.get( ip ); 
            TreePath tp = getPathForRow( row );
            Rectangle rtp = this.getPathBounds( tp );
            Rectangle rsp = scrollPane.getViewport().getViewRect();
            if ( !rtp.intersects( rsp)) {
                scrollPane.getViewport().scrollRectToVisible( rtp );
            }
        }

这是第一次,但不是每次都有效。

但如果我无法解决这个问题,那将是一个新帖子。我认为滚动窗格或视口已经以我未处理的方式发生了变化。

答案 1 :(得分:0)

我找到了一种更好的JTree工作方法。

上述方法适用于JLists。

由于我有一个行映射,给定行号,有一个特定于JTree的组件调用。

            scrollRowToVisible( row );

,代码变为

    if ( ipRowMap.containsKey( ip )) {
        row = ipRowMap.get( ip ); 
        scrollRowToVisible( row );
    }