成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入Java布局管理器

開發(fā) 后端
雖然Java在GUI方面由于Awt和Swing復(fù)雜的結(jié)構(gòu)而不是特別成功,但GUI已成為程序發(fā)展的必然方向。本文詳細(xì)講解了Java GUI開發(fā)中的布局管理器的具體實(shí)現(xiàn)。

Java的GUI界面定義是由awt類和swing類來完成的。它在布局管理上面采用了容器和布局管理分離的方案。也就是說,容器只管將其他小件放入其中,而不管這些小件是如何放置的。對(duì)于布局的管理交給專門的布局管理器類(LayoutManager)來完成。

其實(shí),Java在GUI方面應(yīng)該是并不成功的。Awt類和swing類的結(jié)構(gòu)非常復(fù)雜,加上充斥其間的子類繼承和接口實(shí)現(xiàn),使得要想掌握這兩個(gè)類非常困難。這也是很多的Java程序員抱怨的事情,但GUI已經(jīng)成了程序發(fā)展的方向,所以這里我們也得勉為其難了。

現(xiàn)在我們來看Java中布局管理器的具體實(shí)現(xiàn)。我們前面說過,Java中的容器類(Container),它們只管加入小件(Meta),也就是說,它只使用自己的add()方法向自己內(nèi)部加入小件。同時(shí)他記錄這些加入其內(nèi)部的小件的個(gè)數(shù),可以通過container.getComponentCount()方法類獲得小件的數(shù)目,通過container.getComponent(i)來獲得相應(yīng)小件的句柄。然后LayoutManager類就可以通過這些信息來實(shí)際布局其中的小件了。

Java已經(jīng)為我們提供了幾個(gè)常用的布局管理器類,例如:BorderLayout、FlowLayout、GridBagLayout等等。但在實(shí)際的布局上,我們還是會(huì)有其他的需要。我在不久前的一個(gè)問題中曾經(jīng)要一個(gè)垂直的流式布局,我稱之為VflowLayout,其實(shí)BoxLayout和GridBagLayout可以完成類似的工作,但前者是swing類的成員,我的客戶端是一個(gè)applet,不能使用,而后者必須在類生成的時(shí)候指定列數(shù),而失去了靈活性,所以我決定重寫一個(gè)自己的布局管理器來實(shí)現(xiàn)。經(jīng)過分析,所有的LayoutManager都要實(shí)現(xiàn)一個(gè)接口,就是LayoutManager Inerface或者是他的一個(gè)子接口LayoutManager2 Interface,后者用于復(fù)雜的布局管理,例如GridCardLayout。LayoutManager有五個(gè)方法需要實(shí)現(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);

***個(gè)方法其實(shí)就是你在使用container.add(String name,component comp);時(shí)調(diào)用的方法,例如BorderLayout為布局管理器時(shí)。但在FlowLayout中由于沒有其他的附加信息,所以不需要填充這個(gè)方法。相應(yīng)的第二個(gè)方法也就不需要填充了。真正核心的方法是第三個(gè)和第五個(gè)方法,前者是最終確定Container有多大的,而后者就是決定Container中各個(gè)小件的實(shí)際位置的了。也就是說,當(dāng)我們用container.setLayout(LayoutManager)后,再加入小件后,***系統(tǒng)做的工作其實(shí)是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);
     }
    }

【編輯推薦】

  1. Java Swing中鍵盤事件的處理
  2. 反射在Java Swing編程中的應(yīng)用

責(zé)任編輯:佚名 來源: Java8
相關(guān)推薦

2012-04-23 10:49:04

AWTJava

2011-06-10 09:29:36

Qt Creator 布局管理器

2012-12-31 10:36:58

Android開發(fā)RelativeLay布局

2011-07-04 15:43:03

Qt 布局管理器 designer

2009-11-11 17:24:59

ADO.NET連接管理

2010-12-28 14:53:29

服務(wù)器管理器

2012-12-11 10:10:30

Javaswing.Group

2009-07-17 09:44:28

Look And Fe布局管理器SWT和Swing

2020-12-25 07:41:36

KubernetesOpenKruise應(yīng)用

2013-03-29 12:52:14

Android位置管理

2020-03-12 18:34:30

Windows 10Windows任務(wù)管理器

2015-12-08 12:17:04

2022-02-18 08:25:46

微軟Windows 11任務(wù)管理器

2009-09-29 09:44:52

Hibernate事務(wù)

2011-06-30 09:31:54

Chrome OS

2009-07-22 08:54:32

Oracle恢復(fù)管理器

2020-03-09 11:43:35

RustCargo編程語言

2020-10-12 09:00:00

Firefox任務(wù)管理器瀏覽器

2023-08-15 15:09:18

LinuxCompiz

2020-12-03 12:06:54

HarmonyOS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧美日韩精品久久亚洲区 | 欧美日韩欧美 | 日韩欧美在线观看 | 欧美精品久久久 | 日韩精品在线播放 | 日韩精品久久久久久 | 91国内精精品久久久久久婷婷 | 久久成人18免费网站 | 国产精品1| 久久久国产一区二区三区 | 国产精品黄视频 | 欧美99| 99热首页| 久久伊人精品 | 一级电影免费看 | www.国产| 亚洲一区中文字幕 | 九一视频在线播放 | 欧美一区二区在线免费观看 | 精品视频在线观看 | 在线黄| 一区二区电影网 | 亚洲天堂中文字幕 | 国产精品v | 不卡一区二区在线观看 | 国产精品久久久亚洲 | 热久久久| 91精品国产一区二区三区动漫 | 国产一级视频在线 | 免费成人高清在线视频 | 国产精品成人一区二区三区夜夜夜 | 成人午夜电影在线观看 | av一级毛片 | 黄色片在线免费看 | 国产精品三级久久久久久电影 | 日韩中文字幕一区二区三区 | 一区二区av | 国产精品久久久久久久久免费软件 | 国产精品综合网 | 国产91亚洲精品一区二区三区 | 欧美日韩不卡合集视频 |