我有一个JTree和一个自定义渲染器。
JTree是一个由交换机和端口号组成的IP地址树。
我有一个ip地址图。
当用户点击图表行时,我尝试更新JTree以显示用户选择的行。
如果用户鼠标在图表中选择了ip,则渲染器包含该节点,并且因为行和TreePath可用,所以很容易发生其他操作。
如果ip的列表很大而且有些滚动到视口之外,我在查找我要选择并在视口中显示的对象/ ip的行或treenode时遇到问题。
我在JTree中有一个ActionEvent,它从getUserObject()返回一些构成节点文本的文本。
我不知道如何找到行或TreeNode。如果我能找到它们,我可以检查行是否可见,如果没有调用makeVisible(treePath) - 或者使用scrollPane.getViewport()。getViewRect()并将其与treeNode的rect进行比较。
感谢您的任何提示或方向...... 吉姆
答案 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 );
}