转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> JAVA开发 >> 正文
Java布局管理器深入讨论         ★★★★

Java布局管理器深入讨论

作者:闵涛 文章来源:闵涛的学习笔记 点击数:966 更新时间:2009/4/22 23:26:34

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

  大家可以试一下。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台