布局管理器中的两个方法validate()与layoutContainer()

今天在写swing程序时遇到下面两个方法,Container.validate()方法与LayoutManager.layoutContainer(Container parent)方法。不是太熟悉,查了一下API仍没有看太明白,就到网上查了一下,得到如下信息:

1、 layoutContainer是最重要的方法,因为组件的最终布局都是在该方法中实现的。这个方法会被awt-swing框架自动调用,例如改变组件的字体、容器尺寸改变等都会引起该方法的调用。

2、 java.awt.Containervalidate方法实现代码:
Code:
  1. public void validate()  
  2.   
  3. {  
  4.   
  5.    /* Avoid grabbing lock unless really necessary. */  
  6.   
  7.    if (!isValid())  
  8.   
  9.    {  
  10.   
  11.        boolean updateCur = false;  
  12.   
  13.        synchronized (getTreeLock())  
  14.   
  15.        {  
  16.   
  17.           if (!isValid() && peer != null)  
  18.   
  19.           {  
  20.   
  21.               ContainerPeer p = null;  
  22.   
  23.               if (peer instanceof ContainerPeer)  
  24.   
  25.               {  
  26.   
  27.                  p = (ContainerPeer) peer;  
  28.   
  29.               }  
  30.   
  31.               if (p != null)  
  32.   
  33.               {  
  34.   
  35.                  p.beginValidate();  
  36.   
  37.               }  
  38.   
  39.               validateTree();  
  40.   
  41.               if (p != null)  
  42.   
  43.               {  
  44.   
  45.                  p.endValidate();  
  46.   
  47.                  updateCur = isVisible();  
  48.   
  49.               }  
  50.   
  51.           }  
  52.   
  53.        }  
  54.   
  55.        if (updateCur)  
  56.   
  57.        {  
  58.   
  59.           updateCursorImmediately();  
  60.   
  61.        }  
  62.   
  63.    }  
  64.   
  65. }  

注意该方法中调用了validateTree()方法,下面给出validateTree()方法实现代码:

Code:
  1. protected void validateTree()  
  2.   
  3. {  
  4.   
  5.     if (!isValid())  
  6.   
  7.     {  
  8.   
  9.        if (peer instanceof ContainerPeer)  
  10.   
  11.        {  
  12.   
  13.            ((ContainerPeer)peer).beginLayout();  
  14.   
  15.        }  
  16.   
  17.        doLayout();  
  18.   
  19.         for (int i = 0; i < component.size(); i++)  
  20.   
  21.         {  
  22.   
  23.             Component comp = component.get(i);  
  24.   
  25.             if ((comp instanceof Container) && !(comp instanceof Window)  
  26.   
  27.                    && !comp.isValid())  
  28.   
  29.             {  
  30.   
  31.                 ((Container)comp).validateTree();  
  32.   
  33.             }  
  34.   
  35.             else  
  36.   
  37.             {  
  38.   
  39.                 comp.validate();  
  40.   
  41.             }  
  42.   
  43.         }  
  44.   
  45.         if (peer instanceof ContainerPeer)  
  46.   
  47.        {  
  48.   
  49.            ((ContainerPeer)peer).endLayout();  
  50.   
  51.        }  
  52.   
  53.     }  
  54.   
  55.     super.validate();  
  56.   
  57. }  

 

注意该方法中调用了doLayout()方法,下面给出doLayout()方法实现代码:

Code:
  1. public void doLayout()  
  2.   
  3. {  
  4.   
  5.         layout();  
  6.   
  7. }  
  8.   
  9.   
  10.   
  11. /** 
  12.  
  13.  * @deprecated As of JDK version 1.1, 
  14.  
  15.  * replaced by <code>doLayout()</code>. 
  16.  
  17.  */  
  18.   
  19. @Deprecated  
  20.   
  21. public void layout()  
  22.   
  23. {  
  24.   
  25.         LayoutManager layoutMgr = this.layoutMgr;  
  26.   
  27.         if (layoutMgr != null)  
  28.   
  29.         {  
  30.   
  31.            layoutMgr.layoutContainer(this);  
  32.   
  33.         }  
  34.   
  35. }  

 

API文档中,关于此方法的用法有如下说明:使此容器布置其组件。大部分程序不应该直接调用此方法,而是应该调用 validate 方法。

至此,我已经明白了这两个方法之间的关系。通过这一过程,我又更加深刻地认识到一点:要想学好java,还要时刻记得学习源码!当然,互联网对我们的学习也是有很大帮助的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值