国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Java布局管理器深入討論

2019-11-18 12:12:29
字體:
供稿:網(wǎng)友

  我們都知道,java的GUI界面定義是由awt類和swing類來完成的。它在布局治理上面采用了容器和布局治理分離的方案。也就是說,容器只管將其他小件放入其中,而不管這些小件是如何放置的。對于布局的治理交給專門的布局治理器類(LayoutManager)來完成。
  其實,java在GUI方面應(yīng)該是并不成功的。Awt類和swing類的結(jié)構(gòu)非常復(fù)雜,加上充斥其間的子類繼續(xù)和接口實現(xiàn),使得要想把握這兩個類非常困難。這也是很多的java程序員抱怨的事情,但GUI已經(jīng)成了程序發(fā)展的方向,所以這里我們也得勉為其難了。
  現(xiàn)在我們來看java中布局治理器的具體實現(xiàn)。我們前面說過,java中的容器類(Container),它們只管加入小件(Meta),也就是說,它只使用自己的add()方法向自己內(nèi)部加入小件。同時他記錄這些加入其內(nèi)部的小件的個數(shù),可以通過container.getComponentCount()方法類獲得小件的數(shù)目,通過container.getComponent(i)來獲得相應(yīng)小件的句柄。然后LayoutManager類就可以通過這些信息來實際布局其中的小件了。
  java已經(jīng)為我們提供了幾個常用的布局治理器類,例如:BorderLayout、FlowLayout、GridBagLayout等等。但在實際的布局上,我們還是會有其他的需要。我在不久前的一個問題中曾經(jīng)要一個垂直的流式布局,我稱之為VflowLayout,其實BoxLayout和GridBagLayout可以完成類似的工作,但前者是swing類的成員,我的客戶端是一個applet,不能使用,而后者必須在類生成的時候指定列數(shù),而失去了靈活性,所以我決定重寫一個自己的布局治理器來實現(xiàn)。經(jīng)過分析,所有的LayoutManager都要實現(xiàn)一個接口,就是LayoutManager Inerface或者是他的一個子接口LayoutManager2 Interface,后者用于復(fù)雜的布局治理,例如GridCardLayout。LayoutManager有五個方法需要實現(xiàn),分別是:
  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);時調(diào)用的方法,例如BorderLayout為布局治理器時。但在FlowLayout中由于沒有其他的附加信息,所以不需要填充這個方法。相應(yīng)的第二個方法也就不需要填充了。真正核心的方法是第三個和第五個方法,前者是最終確定Container有多大的,而后者就是決定Container中各個小件的實際位置的了。也就是說,當(dāng)我們用container.setLayout(LayoutManager)后,再加入小件后,最后系統(tǒng)做的工作其實是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);
      }
     }
  大家可以試一下。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 芜湖县| 嘉义市| 石泉县| 普宁市| 东莞市| 开江县| 诏安县| 云南省| 中阳县| 定陶县| 丽江市| 苍溪县| 丹寨县| 青神县| 铜鼓县| 伽师县| 长白| 昌乐县| 宜兰县| 湖州市| 榆林市| 九寨沟县| 武川县| 静乐县| 谷城县| 桃园县| 台南市| 平山县| 井冈山市| 开封县| 高淳县| 讷河市| 福清市| 任丘市| 皋兰县| 屏边| 伊春市| 陇南市| 光泽县| 宝山区| 松阳县|