在界面设计中,一个容器要放置许多组件,为了美观,为组件安排在容器中的位置,这就是布局设计。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);
如对本文有疑问, 点击进行留言回复!!
Android 4.0使用Kotlin调用C语言以及汇编语言
Java Class.forName()用法和newInstance()方法原理解析
网友评论