您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页6深入JAVA布局管理器

6深入JAVA布局管理器

来源:飒榕旅游知识分享网
深入Java布局管理器

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都要实现一个接口,就是

LayoutManagerInerface或者是他的一个子接口LayoutManager2Interface,后者用于复杂的布局管理,例如GridCardLayout。LayoutManager有五个方法需要实现,分别是:

1、publicvoidaddLayoutComponent(Stringname,Componentcomp);2、publicvoidremoveLayoutComponent(Componentcomp);3、publicDimensionpreferredLayoutSize(Containercontainer);4、publicDimensionminimumLayoutSize(Containercontainer);5、publicvoidlayoutContainer(Containercontainer);

第一个方法其实就是你在使用container.add(Stringname,componentcomp);时调用的方法,例如BorderLayout为布局管理器时。但在FlowLayout中由于没有其他的附加信息,所以不需要填充这个方法。相应的第二个方法也就不需要填充了。真正核心的方法是第三个和第五个方法,前者是最终确定Container

有多大的,而后者就是决定Container中各个小件的实际位置的了。也就是说,当我们用container.setLayout(LayoutManager)后,再加入小件后,最后系统做的工作其实是LayoutManager.layoutContainer(container);和

container.setSize(LayoutManager.PreferredLayoutSize(container));。下面是我的新类:VflowLayout

packagerender_account;importjava.awt.*;importjava.io.*;

publicclassVFlowLayoutimplementsLayoutManager,Serializable{inthgap;intvgap;

publicVFlowLayout(){this(5,5);}

publicVFlowLayout(inti,intj){this.hgap=i;this.vgap=j;}

publicvoidaddLayoutComponent(Stringname,Componentcomp){}

publicvoidremoveLayoutComponent(Componentcomp){}

publicDimensionpreferredLayoutSize(Containercontainer){synchronized(container.getTreeLock()){Dimensiondimension1=newDimension(0,0);inti=container.getComponentCount();

for(intj=0;jComponentcomponent=container.getComponent(j);if(component.isVisible()){

Dimensiondimension2=component.getPreferredSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);if(j>0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;}}

Insetsinsets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;dimension1.width+=insets.left+insets.right+hgap*2;Dimensiondimension=dimension1;returndimension;

file://return(newDimension(50,200));}

}

publicDimensionminimumLayoutSize(Containercontainer){synchronized(container.getTreeLock()){Dimensiondimension1=newDimension(0,0);inti=container.getComponentCount();

for(intj=0;jComponentcomponent=container.getComponent(j);if(component.isVisible()){

Dimensiondimension2=component.getMinimumSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);if(j>0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;}}

Insetsinsets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;dimension1.width+=insets.left+insets.right+hgap*2;Dimensiondimension=dimension1;returndimension;}}

publicvoidlayoutContainer(Containercontainer){synchronized(container.getTreeLock()){Insetsinsets=container.getInsets();int

vSpace=container.getSize().height-(insets.top+insets.bottom+vgap*2);intcomponentCount=container.getComponentCount();intleft=insets.left+hgap;inttotalHeight=0;intwidth=0;

intcomponentStart=0;

for(inti=0;iComponentcomponent=container.getComponent(i);if(component.isVisible()){

Dimensiondimension=component.getPreferredSize();component.setSize(dimension.width,dimension.height);

if(totalHeight==0||totalHeight+dimension.height<=vSpace){if(totalHeight>0)totalHeight+=vgap;

totalHeight+=dimension.height;

width=Math.max(width,dimension.width);}else{

moveComponents(container,insets.top+vgap,left,width,componentStart,i);totalHeight=0;left+=hgap+width;

width=dimension.width;componentStart=i;}}}

moveComponents(container,insets.top+vgap,left,width,componentStart,componentCount);}}

privatevoidmoveComponents(Containercontainer,inttop,intleft,intwidth,intcomponentStart,intcomponentEnd){synchronized(container.getTreeLock()){for(inti=componentStart;iComponentcomponent=container.getComponent(i);if(component.isVisible()){component.setLocation(left,top);

top+=component.getPreferredSize().height+vgap;}}}}

publicvoidsetHgap(inti){this.hgap=i;}

publicvoidsetVgap(inti){this.vgap=i;}

publicintgetHgap(){return(this.hgap);}

publicintgetVgap(){return(this.vgap);}}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务