深入Java布局管理器

上一篇 / 下一篇  2012-08-06 11:40:21 / 个人分类:Java

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

)_xl7N-Ku v!~U0  其实,Java在GUI方面应该是并不成功的。Awt类和swing类的结构非常复杂,加上充斥其间的子类继承和接口实现,使得要想掌握这两个类非常困难。这也是很多的Java程序员抱怨的事情,但GUI已经成了程序发展的方向,所以这里我们也得勉为其难了。51Testing软件测试网 P(\c n$U#~

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

6T@8I;`q0

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

B&|"ty,kPT5^0  1、public void addLayoutComponent(String name, Component comp);51Testing软件测试网)`p8@r7wo

51Testing软件测试网J~:fQjvq&g

  2、public void removeLayoutComponent(Component comp);

+r3i%Ga:\\i.Tu p051Testing软件测试网'nx:u4HOr`Sj

  3、public Dimension preferredLayoutSize(Container container);

,A_"K$e%ej0

'bw'Xt z4rfy9tlm0  4、public Dimension minimumLayoutSize(Container container);51Testing软件测试网"Z|)Sa+{d:Z n

51Testing软件测试网K,q7{2L"g$z/T+c

  5、public void layoutContainer(Container container);

#~"e;q B:kef0

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

d^a)hF2xz0

:E3W3h({fh3tn0  下面是我的新类:VflowLayout51Testing软件测试网S8g*p+{,^-SFF

package render_account;
'V+c:\,e.D&LO&F0import java.awt.*;51Testing软件测试网y:B X7~l#pG0Hn
import java.io.*;
B#B0[8Q\Q)[K7I5cJX0public class VFlowLayout implements LayoutManager,Serializable{51Testing软件测试网7g f:^$[O Y7_j$f/P
  int hgap;51Testing软件测试网;gq[C"J Qz4C*}
  int vgap;

TAG:

 

评分:0

我来说两句

Open Toolbar