熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java布局管理器深入討論

2013-11-23 19:26:05  來源: Java核心技術 

  我們都知道java的GUI界面定義是由awt類和swing類來完成的它在布局管理上面采用了容器和布局管理分離的方案也就是說容器只管將其他小件放入其中而不管這些小件是如何放置的對於布局的管理交給專門的布局管理器類(LayoutManager)來完成
  其實java在GUI方面應該是並不成功的Awt類和swing類的結構非常復雜加上充斥其間的子類繼承和接口實現使得要想掌握這兩個類非常困難這也是很多的java程序員抱怨的事情但GUI已經成了程序發展的方向所以這裡我們也得勉為其難了
  現在我們來看java中布局管理器的具體實現我們前面說過java中的容器類(Container)它們只管加入小件(Meta)也就是說它只使用自己的add()方法向自己內部加入小件同時他記錄這些加入其內部的小件的個數可以通過containergetComponentCount()方法類獲得小件的數目通過containergetComponent(i)來獲得相應小件的句柄然後LayoutManager類就可以通過這些信息來實際布局其中的小件了
  java已經為我們提供了幾個常用的布局管理器類例如BorderLayoutFlowLayoutGridBagLayout等等但在實際的布局上我們還是會有其他的需要我在不久前的一個問題中曾經要一個垂直的流式布局我稱之為VflowLayout其實BoxLayout和GridBagLayout可以完成類似的工作但前者是swing類的成員我的客戶端是一個applet不能使用而後者必須在類生成的時候指定列數而失去了靈活性所以我決定重寫一個自己的布局管理器來實現經過分析所有的LayoutManager都要實現一個接口就是LayoutManager Inerface或者是他的一個子接口LayoutManager Interface後者用於復雜的布局管理例如GridCardLayoutLayoutManager有五個方法需要實現分別是
  public void addLayoutComponent(String name Component comp);
  public void removeLayoutComponent(Component comp);
  public Dimension preferredLayoutSize(Container container);
  public Dimension minimumLayoutSize(Container container);
  public void layoutContainer(Container container);
  第一個方法其實就是你在使用containeradd(String namecomponent comp);時調用的方法例如BorderLayout為布局管理器時但在FlowLayout中由於沒有其他的附加信息所以不需要填充這個方法相應的第二個方法也就不需要填充了真正核心的方法是第三個和第五個方法前者是最終確定Container有多大的而後者就是決定Container中各個小件的實際位置的了也就是說當我們用containersetLayout(LayoutManager)後再加入小件後最後系統做的工作其實是LayoutManager layoutContainer(container);和containersetSize(LayoutManager PreferredLayoutSize(container));
  下面是我的新類VflowLayout
    package render_account;
    import javaawt*;
    import javaio*;
  public class VFlowLayout implements LayoutManagerSerializable{
     int hgap;
     int vgap;
  public VFlowLayout(){
      this();
     }
  public VFlowLayout(int iint j){
      thishgap=i;
      thisvgap=j;
     }
     public void addLayoutComponent(String name Component comp){
  
     }
     public void removeLayoutComponent(Component comp){
      }
  public Dimension preferredLayoutSize(Container container){
      synchronized(containergetTreeLock()){
      Dimension dimension=new Dimension();
      int i=containergetComponentCount();
      for(int j=;j       Component component = containergetComponent(j);
        if(componentisVisible()){
          Dimension dimension=componentgetPreferredSize();
          dimensionwidth=Mathmax(dimensionwidthdimensionwidth);
     if(j>)  dimensionheight+=vgap;   dimensionheight+=dimensionheight;
          }
        }
        Insets insets=containergetInsets();
        dimensionheight+=insetstop+insetsbottom+vgap*;
        dimensionwidth+=insetsleft+insetsright+hgap*;
        Dimension dimension=dimension;
     return dimension;
  file://return(new Dimension());
       }
      }
  public Dimension minimumLayoutSize(Container container){
       synchronized(containergetTreeLock()){
       Dimension dimension=new Dimension();
       int i=containergetComponentCount();
       for(int j=;j      Component component = containergetComponent(j);
       if(componentisVisible()){
        Dimension dimension=componentgetMinimumSize();
        dimensionwidth=Mathmax(dimensionwidthdimensionwidth);
        if(j>)
         dimensionheight+=vgap;
         dimensionheight+=dimensionheight;
        }
       }
       Insets insets=containergetInsets();
       dimensionheight+=insetstop+insetsbottom+vgap*;
       dimensionwidth+=insetsleft+insetsright+hgap*;
       Dimension dimension=dimension;
       return dimension;
      }
     }
  
     public void layoutContainer(Container container){
      synchronized(containergetTreeLock()){
      Insets insets=containergetInsets();
      int vSpace=containergetSize()height(insetstop+insetsbottom+vgap*);
      int componentCount=containergetComponentCount();
      int left=insetsleft+hgap;
      int totalHeight=;
      int width=;
      int componentStart=;
      for(int i=;i      Component component=containergetComponent(i);
       if(componentisVisible()){
        Dimension dimension=componentgetPreferredSize();
    componentsetSize(dimensionwidthdimensionheight);
        if(totalHeight== || totalHeight+dimensionheight<=vSpace){
         if(totalHeight>)
    totalHeight+=vgap;
          totalHeight+=dimensionheight;
          width=Mathmax(widthdimensionwidth);
         }else{
          moveComponents(containerinsetstop+vgapleftwidthcomponentStarti);
      totalHeight=;
          left+=hgap+width;
  width=dimensionwidth;    componentStart=i;
         }
        }
       }
       moveComponents(containerinsetstop+vgapleftwidthcomponentStartcomponentCount);
      }
     }
  private void moveComponents(Container containerint topint leftint widthint          componentStartint componentEnd){
       synchronized(containergetTreeLock()){
        for(int i=componentStart;i        Component component=containergetComponent(i);
         if(componentisVisible()){   componentsetLocation(lefttop);      top+=componentgetPreferredSize()height+vgap;
         }
        }
       }
      }
  
    public void setHgap(int i){
        thishgap=i;
      }
  
   public void setVgap(int i){
        thisvgap=i;
      }
  
      public int getHgap(){
       return(thishgap);
      }
  
      public int getVgap(){
       return(thisvgap);
      }
     }
  大家可以試一下

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26862.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.