彩票走势图

Java中布局管理器的具体实现

转帖|其它|编辑:郝浩|2010-09-30 11:41:05.000|阅读 572 次

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

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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

  第一个方法其实就是你在使用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(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;

  file://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);

  }

  }


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP