java自定义布局管理(二)

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);

第一个方法其实就是你在使用container.add(String name,component comp);时调用的方法,例如BorderLayout为布局管理器时。但在FlowLayout中由于没有其他的附加信息,所以不需要填充这个方法。

相应的第二个方法也就不需要填充了。

真正核心的方法是第三个和第五个方法,前者是最终确定Container有多大的,而后者就是决定Container中各个小件(meta)的实际位置的了。也就是说,当我们用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(container.getTreeLock()){

    Dimension dimension1=new Dimension(0,0);

    int i=container.getComponentCount();

    for(int j=0;j

Component component = container.getComponent(j);

if(component.isVisible()){

Dimension dimension2=component.getPreferredSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);

if(j>0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;

}

}

Insets insets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;

dimension1.width+=insets.left+insets.right+hgap*2;

Dimension dimension=dimension1;

return dimension;

//return(new Dimension(50,200));

}

}


public Dimension minimumLayoutSize(Container container){

synchronized(container.getTreeLock()){

Dimension dimension1=new Dimension(0,0);

int i=container.getComponentCount();

for(int j=0;j

Component component = container.getComponent(j);

if(component.isVisible()){

Dimension dimension2=component.getMinimumSize();

dimension1.width=Math.max(dimension1.width,dimension2.width);

if(j>0)

dimension1.height+=vgap;

dimension1.height+=dimension2.height;

}

}

Insets insets=container.getInsets();

dimension1.height+=insets.top+insets.bottom+vgap*2;

dimension1.width+=insets.left+insets.right+hgap*2;

Dimension dimension=dimension1;

return dimension;

}

}


public void layoutContainer(Container container){

synchronized(container.getTreeLock()){

Insets insets=container.getInsets();

int vSpace=container.getSize().height-(insets.top+insets.bottom+vgap*2);

int componentCount=container.getComponentCount();

int left=insets.left+hgap;

int totalHeight=0;

int width=0;

int componentStart=0;

for(int i=0;i

Component component=container.getComponent(i);

if(component.isVisible()){

Dimension dimension=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);

}

}


private void moveComponents(Container container,int top,int left,int width,int componentStart,int componentEnd){

synchronized(container.getTreeLock()){

for(int i=componentStart;i

Component component=container.getComponent(i);

if(component.isVisible()){

component.setLocation(left,top);

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

}

}

}

}


public void setHgap(int i){

this.hgap=i;

}


public void setVgap(int i){

this.vgap=i;

}


public int getHgap(){

return(this.hgap);

}


public int getVgap(){

return(this.vgap);

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值