当前位置: 移动技术网 > IT编程>开发语言>Java > java图形界面之布局设计

java图形界面之布局设计

2019年07月22日  | 移动技术网IT编程  | 我要评论

在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。java.awt中定义了多种布局类,每种布局类对应一种布局的策略。常用的有以下布局类:

•flowlayout,依次放置组件。
•boarderlayout,将组件放置在边界上。
•cardlayout,将组件像扑克牌一样叠放,而每次只能显示其中一个组件。
•gridlayout,将显示区域按行、列划分成一个个相等的格子,组件依次放入这些格子中。
•gridbaglayout,将显示区域划分成许多矩形小单元,每个组件可占用一个或多个小单元。

其中gridbaglayout能进行精细的位置控制,也最复杂,本教程暂不讨论这种布局策略,将在专题文章中进行详细讲解。

每个容器都有一个布局管理器,由它来决定如何安排放入容器内的的组件。布局管理器是实现layoutmanager接口的类。

一.flowlayout布局 (japplet,jpanel,jscrollpane默认布局)

flowlayout布局是将其中的组件按照加入的先后顺序从左到右排列,一行满之后就转到一下行继续从左到右排列,每一行中的组件都居中排列。这是一种最简便的布局策略,一般用于组件不多的情况,当组件较多时,容器中的组件就会显得高低不平,各行长短不一。

flowlayout是小应用程序和面板默认布局,flowlayout布局的构造方法有:

1.flowlayout(),生成一个默认的flowlayout布局。默认情况下,组件居中,间隙为5个像素。
2.flowlayout(int aligment),设定每珩的组件的对齐方式。alignment取值可以为 flowlayout.left,flowlayout.center,flowlayout.right。
3.flowlayout(int aligment,int horz, int vert),设定对齐方式,并设定组件的水平间距horz和垂直间距vert,用超类container的方法setlayout()为容器设定布局。例如,代码setlayout(new flowlayout())为容器设定 flowlayout布局。将组件加入容器的方法是add(组件名)。

二.borderlayout布局(jwindow、jframe,jdialog的默认布局)

borderlayout布局策略是把容器内的空间简单划分为东“east”,西 “west”,南 “south”,北 “north”,中 “center”五个区域。加入组件时,都应该指明把组件放在哪一个区域中。一个位置放一个组件。如果某个位置要加入多个组件,应先将要加入该位置的组件放放另一个容器中,然后再将这个容器加入到这个个位置。

borderlayout布局的构造方法有:
(1) borderlayout(),生成一个默认的borderlayout布局。默认情况下,没有间隙。
(2) borderlayout(int horz,int vert),设定组件之间的水平间距和垂直间距。

borderlayout布局策略的设定方法是setlayout(new borderlayout())。将组件加入到容器的方法是add(组件名,位置),如果加入组件时没有指定位置,则默认为“中”位置。

borderlayout布局是jwindow、jframe,jdialog的默认布局。
【例 11-5】应用程序设有五个标签、分别放于窗口的东、西、南、北和中五个区域。

 import javax.swing.*;import java.awt.*;
 public class j505{
   public static void main(string[]args){
     jlabel label1,label2,label3,label4,label5;
     jframe mw=new jframe("我是一个窗口");//创建一个窗口容器对象
     mw.setsize(250,200);
     container con=mw.getcontentpane();
     con.setlayout(new borderlayout());
     label1=new jlabel("东标签");//默认左对齐
     label2=new jlabel("南标签",jlabel.center);
     label3=new jlabel("西标签");
     label4=new jlabel("北标签",jlabel.center);
     label5=new jlabel("中标签",jlabel.center);
     con.add(label1,"east");
     con.add(label2,"south");
     con.add(label3,"west");
     con.add(label4,"north");
     con.add(label5,"center");
     mw.setvisible(true);
   }
 }

三.gridlayout布局

gridlayout布局是把容器划分成若干行和列的网格状,行数和列数由程序控制,组件放在网格的小格子中。gridlayout布局的特点是组件定位比较精确。由于gridlayout布局中每个网格具有相同形状和大小,要求放入容器的组件也应保持相同的大小。

gridlayout布局的构造方法有:
(1) gridlayout(),生成一个单列的gridlayout布局。默认情况下,无间隙。
(2) gridlayout(int row,int col),设定一个有行row和列col的gridlayout布局。
(3) gridlayout(int row,int col,int horz,int vert),设定布局的行数和列数、组件的水平间距和垂直间距。

gridlayout布局以行为基准,当放置的组件个数超额时,自动增加列;反之,组件太少也会自动减少列,行数不变,组件按行优先顺序排列(根据组件自动增减列)。gridlayout布局的每个网格必须填入组件,如果希望某个网格为空白,可以用一个空白标签(add(new label()))顶替。

【例 11-6】小应用程序先将若干个按钮和若干个标签放入jpanel中,然后将jpanel放入jscrollpane中,最后,将jscrollpane放入小程序的窗口中,程序所创建的jscrollpane总是带水平和垂直滚动条,滚动面板的可视范围小于面板的实际要求,可以移动滚动条的滑块显示面板原先不在可视范围内的区域。

import java.applet.*;
import javax.swing.*;
import java.awt.*;
class mywindow extends jframe{
  public mywindow(int w,int h){
    settitle("滚动面板实例");
    container con=getcontentpane();
    con.setpreferredsize(new dimension(w,h));
    con.setlayout(new borderlayout());
    jpanel p=new jpanel();
    p.setlayout(new gridlayout(6,6));
    for (int i=0;i<6;i++){
      p.add(new jlabel());
      for(int j=1;j<=2;j++){
        p.add(new jbutton("按钮"+(2*i+j)));
        p.add(new jlabel("标签"+(2*i+j)));
      }
      p.add(new jlabel());
    }
    p.setbackground(color.blue);
    p.setpreferredsize(new dimension(w+60,h+60));
    jscrollpane scrollpane=new jscrollpane(p);
    scrollpane.setpreferredsize(new dimension(w-60,h-60));
    add(scrollpane,borderlayout.center);//小程序添加滚动面板
    setvisible(true); pack();
  }
}
class scrollpane extends jscrollpane{
  public scrollpane(component p){
    super(p);
    sethorizontalscrollbarpolicy(jscrollpane.horizontal_scrollbar_always);
    setverticalscrollbarpolicy(jscrollpane.vertical_scrollbar_always);
  }
}
public class j506 extends applet{
  mywindow mywindow;
  public void init(){
    mywindow=new mywindow(400,350);
  }
}

gridlayout布局要求所有组件的大小保持一致,这可能会使用界面外观不够美观。一个补救的办法是让一些小组件合并放在一个容器中,然后把这个容器作为组件,再放入到gridlayout布局中。这就是前面所说的容器嵌套。例如,容器a使用gridlayout布局,将容器均分为网格;另有容器b和c各放入若干组件后,把b和c分别作为组件添加到容器a中。容器b和c也可以设置为gridlayout布局,把自己分为若干网格,也可以设置成其他布局。这样,从外观来看,各组件的大小就有了差异。

四.cardlayout布局

采用cardlayout布局的容器虽可容纳多个组件,但是多个组件拥有同一个显示空间,某一时刻只能显示一个组件。就像一叠扑克牌每次只能显示最上面的一张一样,这个显示的组件将占据容器的全部空间。cardlayout布局设计步骤如下:
先创建cardlayout布局对象。然后,使用setlayout()方法为容器设置布局。最的,调用容器的add()方法将组件加入容器。cardlayout布局策略加入组件的方法是:
    add(组件代号,组件);
其中组件代号是字符串,是另给的,与组件名无关。

例如,以下代码为一个jpanel容器设定cardlayout布局:

  cardlayout mycard = new cardlayout();//创建cardlayout布局对象
  jpanel p = new jpanel();//创建panel对象
  p.setlayout(mycard);

用cardlayout类提供的方法显示某一组件的方式有两种:
(1) 使用show(容器名,组件代号)形式的代码,指定某个容器中的某个组件显示。例如,以下代码指定容器p的组件代号k,显示这个组件:
    mycard.show(p,k);
(2) 按组件加入容器的顺序显示组件。

first(容器):例如,代码mycard.first(p);
last(容器):例如 , mycard.last(p);
next(容器):例如,mycard.next(p);
previous(容器):mycard.previous(p);

【例11-7】小应用程序使用cardlayout布局,面板容器p使用cardlayout布局策略设置10个标签组件。窗口设有4个按钮,分别负责显示p的第一个组件、最后一个组件、当前组件的前一个组件和当前的组件的最后一个组件。

import java.applet.*;import java.awt.*;
import java.awt.event.*;import javax.swing.*;
class mypanel extends jpanel{
  int x;jlabel label1;
  mypanel(int a){
    x=a;getsize();
    label1=new jlabel("我是第"+x+"个标签");add(label1);
  }
  public dimension getpreferredsize(){
    return new dimension(200,50);
  }
}
public class j507 extends applet implements actionlistener{
  cardlayout mycard;mypanel mypanel[];jpanel p;
  private void addbutton(jpanel pan,string butname,actionlistener listener){
    jbutton abutton=new jbutton(butname);
    abutton.addactionlistener(listener);
    pan.add(abutton);
  }
  public void init(){
    setlayout(new borderlayout());//小程序的布局是边界布局
    mycard=new cardlayout();
    this.setsize(400,150);
    p=new jpanel();p.setlayout(mycard);//p的布局设置为卡片式布局
    mypanel=new mypanel[10];
    for(int i=0;i<10;i++){
      mypanel[i]=new mypanel(i+1);
      p.add("a"+i,mypanel[i]);
    }
    jpanel p2=new jpanel();
    addbutton(p2,"第一个",this);
    addbutton(p2,"最后一个",this);
    addbutton(p2,"前一个",this);
    addbutton(p2,"后一个",this);
    add(p,"center"); add(p2,"south");
  }
  public void actionperformed(actionevent e){
    if (e.getactioncommand().equals("第一个"))mycard.first(p);
    else if(e.getactioncommand().equals("最后一个"))mycard.last(p);
    else if(e.getactioncommand().equals("前一个"))mycard.previous(p);
    else if(e.getactioncommand().equals("后一个"))mycard.next(p);
  }
}

五.null布局与setbounds方法

 空布局就是把一个容器的布局设置为null布局。空布局采用setbounds()方法设置组件本身的大小和在容器中的位置:
    setbounds(int x,int y,int width,int height)
组件所占区域是一个矩形,参数x,y是组件的左上角在容器中的位置坐标;参数weight,height是组件的宽和高。空布局安置组件的办法分两个步骤:先使用add()方法身容器添加组件。然后调用setbounds()方法设置组件在容器中的位置和组件本身的大小。与组件相关的其他方法:

1.getsize().width,
2.getsize().height
3.setvgap(ing vgap)
4.sethgap(int hgap);

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网