快速业务通道

Java布局管理器的具体实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04

Java布局管理器的具体实现

时间:2010-12-04

我们都知道,java的GUI界面定义是由awt类和swing类来完成的。它在布局管 理上面采用了容器和布局管理分离的方案。也就是说,容器只管将其他小件放入 其中,而不管这些小件是如何放置的。对于布局的管理交给专门的布局管理器类 (LayoutManager)来完成。

其实,java在GUI方面应该是并不成功的。Awt类和swing类的结构非常复杂, 加上充斥其间的子类继承和接口实现,使得要想掌握这两个类非常困难。这也是 很多的java程序员抱怨的事情,但GUI已经成了程序发展的方向,所以这里我们 也得勉为其难了。

现在我们来看java中布局管理器的具体实现。我们前面说过,java中的容器 类(Container),它们只管加入小件(Meta),也就是说,它只使用自己的 add()方法向自己内部加入小件。同时他记录这些加入其内部的小件的个数,可 以通过container.getComponentCount()方法类获得小件的数目,通过 container.getComponent(i)来获得相应小件的句柄。然后LayoutManager类就可 以通过这些信息来实际布局其中的小件了。

java已经为我们提供了几个常用的布局管理器类,例如:BorderLayout、 FlowLayout、GridBagLayout等等。但在实际的布局上,我们还是会有其他的需 要。我在不久前的一个问题中曾经要一个垂直的流式布局,我称之为 VflowLayout,其实BoxLayout和GridBagLayout可以完成类似的工作,但前者是 swing类的成员,我的客户端是一个applet,不能使用,而后者必须在类生成的 时候指定列数,而失去了灵活性,所以我决定重写一个自己的布局管理器来实现 。经过分析,所有的LayoutManager都要实现一个接口,就是LayoutManager Inerface或者是他的一个子接口LayoutManager2 Interface,后者用于复杂的布 局管理,例如GridCardLayout。LayoutManager有五个方法需要实现,分别是:

1、public void addLayoutComponent(String name, Component comp);

2、public void removeLayoutComponent(Component comp);

3、public Dimension preferredLayoutSize(Container container);

4、public Dimension minimumLayoutSize(Container container);

5、public void layoutContainer(Container container);

Java布局管理器的具体实现(2)

时间:2010-12-04

第一个方法其实就是你在使用container.add(String name,component comp);时调用的方法,例如BorderLayout为布局管理器时。但在FlowLayout中由 于没有其他的附加信息,所以不需要填充这个方法。相应的第二个方法也就不需 要填充了。真正核心的方法是第三个和第五个方法,前者是最终确定Container 有多大的,而后者就是决定Container中各个小件的实际位置的了。也就是说, 当我们用container.setLayout(LayoutManager)后,再加入小件后,最后系统做 的工作其实是LayoutManager. layoutContainer(container);和 container.setSize(LayoutManager. PreferredLayoutSize(container));。

下面是我的新类:VflowLayout。

package render_account;    import java.awt.*;    import java.io.*;    public class VFlowLayout implements LayoutManager,Serializable {     int hgap;     int vgap;     public VFlowLayout(){      this(5,5);     }     public VFlowLayout(int i,int j){      this.hgap=i;      this.vgap=j;     }     public void addLayoutComponent(String name, Component comp) {     }     public void removeLayoutComponent(Component comp){      }     public Dimension preferredLayoutSize(Container container){      synchronized(contai

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号