我们都知道,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);