动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息



本月文章推荐
.log4j B/S实战演练: 自动设置备份.
.屏蔽.NET自定义开发组件中的属性.
.一年Java之路的回顾,反思以及展.
.如何在Java应用程序中读取8位和2.
.谈谈JAVA中的调用方式.
.Adapter模式在J2SE事件处理中的应.
.[webservices开发]配置XFire.
.垃圾自动收集系统指导 (1).
.Java Media简介.
.经典Java开发工具介绍(3):Web.
.我眼中的Java经典书籍.
.jsq(SQL测试工具).
.类的转换.
.Eclipse中插件开发之SQLExplorer.
.如何用Java得到硬盘空间.
.Shark中的ToolAgent用法-JavaCla.
.Java 访问 Access 的一般方法介绍.
.Java 5.0 多线程编程实.
.Eclipse中用SWT和JFace开发入门.
.JDO Genie 1.3 发布了!.

Java布局管理器深入讨论

发表日期:2008-1-5 |



  我们都知道,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);
      }
     }
  大家可以试一下。
上一篇:在JavaScript程序中整合Java函数(下) 人气:555
下一篇:Java 连接器架构:EAI的未来? 人气:328
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-24 Sablog-X v2.0 预览版
2008-7-24 帝国备份王EmpireBak 2008 正式版
2008-7-24 网趣网上购物系统时尚版 v8.2
2008-7-24 纵横B2B电子商务系统XYECS!B2B v
2008-7-24 e路小说小偷 v1.2.0723
2008-7-24 凌风美女图片站程序 v2.2
2008-7-24 TOM15电影收索程序
2008-7-24 清风信息自动采集生成系统 v1.0
2008-7-24 QQ邮箱编辑器 v1.0 (小小菜刀ASP
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵