Java布局管理器(一)之布局管理器的工作过程及实现

JAVA布局管理

用户程序界面的设计不仅要求其功能完备,各控件之间的布局设计合理,更要求界面风格使人赏心悦目。为了帮助程序员设立良好的界面,减轻他们的工作强度,Java提供了布局管理器,用来设计和控制各种组件在程序界面中的位置和相对关系,使程序界面中的控件有一种统一协调的整齐布局,Java语言提供了布局管理器用以优化Java用户图形界面设计。

(一)布局管理器的工作过程

每一个容器(可以理解为含有其它组件的组件),例如JPanel或是Container,都有一个布局管理器,准确的说是都保存一个对某布局管理器的引用,通过这个引用容器可以访问这个布局管理器,该布局管理器响应访问并有职责对容器内的组件进行定位和整形。也就是说,容器把布置它的组件的工作授给一个布局管理器,在接到任务时,不同的布局管理器使用不同的算法进行布置组件,容器可以使用适当的布局管理器自由选择布局算法。具体实现就是布局管理器定位组件,它会根据容器中的每一个组件需要多少空间,然后依据所用平台的组件尺寸、可用空间,以及布局管理器的规则在屏幕上尽最好可能来安排组件,因此无论平台或屏幕尺寸大小如何不同,它都能够自动调节相应组件在程序窗体中的相对位置和控件尺寸大小,使每一个组件所需要的尺寸依据我们的程序所部署的平台以及当前的观感的不同而不同,使程序界面布局更加的合理。

为了确定组件需要多少空间,布局管理器调用组件的getMinimumSize()、getPreferredSize()以及getMaximumSize()方法。这些方法报告一个组件要正确显示所需要的最小,适当,以及最大空间。所以每一个组件必须了解其空间需求。然后布局管理器使用组件的空间需求来调整组件尺寸并在屏幕上进行安排。除了布局管理器的设置之外,我们的Java程序不需要担心平台依赖的位置。

有些情况下,布局管理器会忽略一些组件;并没有布局管理器显示所有内容的要求。例如,使用BorderLayout的Container也许会包含30或40个组件;然而,BorderLayout至多显示其中的五个。类似的,CardLayout也许会管理多个组件,但是每次只显示一个。除了忽略组件,布局管理器会对组件的最小,适当以及最大尺寸进行所需要的处理。他可以忽略其中任意或是所有的尺寸。布局管理器忽略适当的尺寸也是有道理的,毕竟,更好的方法就是“如果合适,就给我这个尺寸”。然而,布局管理器也可以忽略最小尺寸。有时,并没有合理的选择,因为也许容器并没有足够的空间以组件的最小尺寸来显示。如何处理这种情况则留给布局管理者的判断力。

 

(二)布局管理器的实现

布局管理器是实现了接口LayoutManage或者是接口LayoutManage2的一个类。

布局管理器的接口定义在java.awt包中。LayoutManager接口定义了布局Container内的Component对象的管理器的职责。正如在前面所解释的,决定JPanel或Container中每一个组件的位置与尺寸是布局管理器的职责。我们不直接调用LayoutManager接口中的方法;对于大部分来说,布局管理器在幕后完成他们的工作。一旦我们创建了LayoutManager对象并且通知容器来使用(通过调用setLayout(manager)),我们就完成了相应的工作。系统会在需要的时候调用布局管理器的相应方法。类似于任意的接口,LayoutManager指定了布局管理器必须实现的方法,但是没有约束LayoutManager如何来完成这些工作。如果我们要编写一个新的布局管理器,那么LayoutManager接口本身是最重要的。我们先来描述这个接口是因为他是所有的布局管理器所基于的基础。我们也会描述LayoutManager2接口,他会为某些布局管理器使用。

(1)LayoutManage接口有5个方法组成:

1.  public interface LayoutManager
2.  {  

3.          public void addLayoutComponent(String name, Component comp);  

4.         public void layoutContainer(Container parent);  

5.        public Dimension minimumLayoutSize(Container parent);  

6.        public Dimension preferredLayoutSize(Container parent);  

7.        public void removeLayoutComponent(Component comp);  

8.      }  

注意:如果我们要创建我们自己的类来实现LayoutManager,我们必须定义所有的五个方法。正如我们将要看到的,一些方法并不需要做任何事情,但是我们必须包含一个具有相应签名的桩。比如说,addLayoutComponent()方法只有当我们通过调用add(String, Component)或是add(Component,Object)方法添加组件时才会被调用,而不是普通的add(Component)方法。对于add(Component, Object)方法,Object必须是String类型,或者是其他不被调用的。

(2)LayoutManag2扩展了LayoutManage接口,是对于要求每一个组件来实现其布局管理器限制的布局管理器,允许向一个带有约束条件的布局管理器添加组件,比如GridBagLayout的约束条件必须是一个GridBagConstraints的引用、BorderLayout需要的约束条件是一个字符串。LayoutManager2的布局管理器包括BorderLayout,CardLayout,以及GridBagLayout等,它也有5个方法组成:

1.    public interface LayoutManager2

2.    {  

3.      public void addLayoutComponent(Component comp, Object constraints);  

4.      public float getLayoutAlignmentX(Container target);  

5.      public float getLayoutAlignmentY(Container target);  

6.      public void invalidateLayout(Container target);  

7.      public Dimension maximumLayoutSize(Container target);  

8.    }  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值