Swing组件的基类JComponent实现滚动到可视区域和JTREE展开(不展开子节点)

本文介绍了如何使用JComponent的scrollRectToVisible方法将JTable的指定行滚动到可视区域,并探讨了JTree的scrollPathToVisible方法以及如何展开特定行而不展开其子节点。详细讨论了TreePath的获取方式以及两种实现JTree展开和收缩节点的策略,包括自定义JTree扩展以访问受保护的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JComponent.scrollRectToVisible--方法

public void scrollRectToVisible(Rectangle aRect)
scrollRectToVisible() 消息转发到 JComponent 的父组件。可执行该请求的组件(如 JViewport)会重写此方法并执行滚动。

参数:
aRect - 可见的 Rectangle
另请参见:
JViewport

 

具体如JTable实现某行滚动到可视图区域如下:

1. 得到对象Rectangle

JTable.getCellRect(int row, int column, boolean includeSpacing)
          返回位于 rowcolumn 相交位置的单元格矩形

public Rectangle getCellRect(int row,
                             int column,
                             boolean includeSpacing)
返回位于 rowcolumn 相交位置的单元格矩形。如果 includeSpacing 为 true,则返回的值具有指定行和列的完整高度和宽度。如果为 false,则返回的矩形为单元格空间减去单元格间的间隙,以便在呈现期间设置该属性后,返回呈现和编辑的组件的真实边界。

如果列索引有效但是行索引小于 0,则此方法返回一个矩形,此矩形的 yheight 设置为合适的值,其xwidth 值都设置为 0。通常,行索引或列索引指示适当区域外的单元格时,此方法都返回一个矩形,它描绘了表范围内最近单元格的最近边。当行索引和列索引都超出范围时,返回的矩形覆盖了最近单元格的最近点。

在所有的情形中,使用此方法沿一个轴的计算结果不会因为沿另一个轴的计算出现异常而失败。当单元格无效时,忽略 includeSpacing 参数。

参数:
row - 所需单元格所在的行索引
column - 所需单元格所在的列索引;不一定与表中数据模型的列索引相同; convertColumnIndexToView(int) 方法可以用来将数据模型的列索引转换为显示的列索引
includeSpacing - 如果为 false,则返回实际的单元格边界,计算方法是从列模型和行模型的高度和宽度中减去单元格间距
返回:
包含 rowcolumn 处单元格的矩形
另请参见:
getIntercellSpacing()

Rectangle rec = JTable.getCellRect(int row, int column, true); //column可为0, row为表格行号

2. JTable..scrollRectToVisible(rec);就可以了.实际上是调用JComponent.scrollRectToVisible(rec);

具体如JTree行滚动到可视图区域有专门的方法如下:

JTree.scrollPathToVisible(TreePath path) ---

 

scrollPathToVisible(TreePath path) 
          确保路径中所有的路径组件均展开(最后一个路径组件除外)并滚动,以便显示该路径标识的节点。

TreePath获得方法:

1.JTree.LeadSelectionPath()

2.JTreegetPathForLocation(int x, int y)

3.JTree.getPathForRow(int row)
4.DefaultMutableTreeNode.getPath() //返回从根到达此节点的路径 TreeNode[]

TreePath(Object[] path)//可构造出TreePath对象,传入参数TreeNode[].

树节点展开方法:这是一个保护方法,需要继承树才能重写

protected  voidsetExpandedState(TreePath path, boolean state)
          设置此 JTree 的展开状态。

setExpandedState

protected void setExpandedState(TreePath path,
                                boolean state)
设置此 JTree 的展开状态。 如果 state 为 true,则 path 的所有父路径和路径都被标记为展开。如果 state 为 false,则 path 的所有父路径被标记为展开,但是 path 本身被标记为折叠。

如果 TreeWillExpandListener 禁止它,则会失败。

 

 

 voidcollapsePath(TreePath path)
          确保指定路径标识的节点是折叠的,并且可查看。
 voidcollapseRow(int row)
          确保指定行中的节点是折叠的。

collapsePath
public void collapsePath(TreePath path)
确保指定路径标识的节点是折叠的,并且可查看。

参数:
path - 标识节点的 TreePath
collapseRow
public void collapseRow(int row)
确保指定行中的节点是折叠的。

如果 row < 0 或 >= getRowCount,则此方法无效。

参数:
row - 指定一个显示行的整数,其中 0 表示显示的第一行

 

JTREE展开(不展开子节点)

方法1:protected void setExpandedState(TreePath path, boolean state)--树节点展开方法:这是一个保护方法,需要继承树才能重写.待测试.

public class JTreeEx extends JTree
{
 private static final long serialVersionUID = 1L;

 public JTreeEx(TreeModel newModel)
 {
  super(newModel);
 }

 @Override
 public void setExpandedState(TreePath path, boolean state)
 {
  super.setExpandedState(path, state);
  
 }

}

 

for (int i = 0; i < tree.getRowCount(); i++)
    {

     TreePath tp = tree.getPathForRow(i);
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent();

     if ("country1".equals(node.getUserObject().toString()))
     {
      // tree.setExpandedState(tp, false);--此方法不好使.后续有时间再测试,现用下面的方法实现.
      tree.expandPath(tp);//先展开,
      Enumeration<?> enums = node.children();
      while (enums.hasMoreElements())
      {
       DefaultMutableTreeNode dtn = (DefaultMutableTreeNode) enums.nextElement();

       TreePath tp1 = tp.pathByAddingChild(dtn);
       tree.collapsePath(tp1);//后收缩
       System.out.println("expande tp1:" + tp1);

      }

     }
    }

   }

 

 

方法2:先展开后收缩.

即public void collapsePath(TreePath path)--会展开此路径的所有父节点和子节点

public void expandPath(TreePath path)---收缩所有子节点.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值