布局管理器
讀者會(huì)發(fā)現(xiàn),如果使用坐標(biāo)定位法(空布局)踩叭,在一個(gè)比較復(fù)雜的界面上定位每個(gè)控件的坐標(biāo)是一個(gè)非常麻煩的工作磕潮,而且在界面大小發(fā)生改變時(shí),控件的絕對(duì)位置也不會(huì)隨之發(fā)生改變容贝。那么如果我們想讓用戶界面上的組件可以按照不同的方式進(jìn)行排列怎么辦自脯?例如:可以依序水平排列,或者按網(wǎng)格方式進(jìn)行排列等斤富,其實(shí)每種排列方案都是指組件的一種“布局”膏潮,要管理這些布局,就需要本節(jié)學(xué)習(xí)的布局管理器满力。
管理布局的類由java.awt包來(lái)提供焕参,布局管理器是一組實(shí)現(xiàn)java.awt.LayoutManager接口的類,由這些類自動(dòng)定位組件油额。一般使用布局管理器定義容器叠纷,如果容器使用了某種布局管理器后,那么放在其上的控件就按照相應(yīng)的規(guī)則排列潦嘶。我們接下來(lái)就介紹幾種常用的布局管理器:流式布局(FlowLayout)涩嚣、邊界布局(BorderLayout)、網(wǎng)格布局(GridLayout)掂僵。如圖1所示航厚。
如上圖所示:如果在一個(gè)容器中壓入控件(該示例的控件用一組JButton代表),我們發(fā)現(xiàn)流式布局會(huì)將控件放在第一行锰蓬,第一行滿了自動(dòng)放置在第二行阶淘,依次類推;而邊界布局會(huì)把控件分布在容器的東互妓、南溪窒、西、北冯勉、中的五個(gè)區(qū)域澈蚌;最后網(wǎng)格布局會(huì)把容器中的控件按n行m列均勻分布。
注意:
1)一旦使用任何布局灼狰,那么控件的坐標(biāo)定位將失效宛瞄。
2)如果在使用流式布局的容器中壓入JTextField控件,那么這個(gè)JTextField的構(gòu)造方法請(qǐng)
3)使用傳int參數(shù)的構(gòu)造方法交胚。
java.awt.FlowLayout
流布局用于安排有方向的控件份汗,這非常類似于段落中的文本行盈电。如表1所示,為FlowLayout類的構(gòu)造方法杯活。
注意:
JPanel的無(wú)參構(gòu)造方法默認(rèn)就是流式布局匆帚。
【示例1】流式布局
packagecn.sxt.views.testlayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassFlowLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButtonbtn1;
privateJButtonbtn2;
privateJButtonbtn3;
privateJButtonbtn4;
privateJButtonbtn5;
publicFlowLayoutDemo() {
//該處代碼也可以寫成:pnlMain = new JPanel(new FlowLayout());
pnlMain=newJPanel();
btn1=newJButton("按鈕1");
btn2=newJButton("按鈕2");
btn3=newJButton("按鈕3");
btn4=newJButton("按鈕4");
btn5=newJButton("按鈕5");
init();
}
privatevoidinit() {
//設(shè)置窗口屬性
this.setTitle("測(cè)試流式布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//將控件添加到容器上
pnlMain.add(btn1);
pnlMain.add(btn2);
pnlMain.add(btn3);
pnlMain.add(btn4);
pnlMain.add(btn5);
//將容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**創(chuàng)建流式布局窗口*/
publicstaticvoidmain(String[ ]args) {
newFlowLayoutDemo();
}
}
執(zhí)行結(jié)果如圖所示:
java.awt. BorderLayout
布置容器的邊界布局,它可以對(duì)容器上的控件進(jìn)行安排旁钧,并調(diào)整其大小吸重,使其符合下列五個(gè)區(qū)域:南、北歪今、東嚎幸、西和中間區(qū)域。如表3所示寄猩,為BorderLayout類的構(gòu)造方法嫉晶。
注意:
邊界布局最多將容器分成5個(gè)區(qū)間,但是可以少田篇,比如只有北车遂、中、南斯辰,或是只有西舶担、中、東彬呻,或是按照需求具體劃分
【示例2】邊界布局
packagecn.sxt.views.testlayout;
importjava.awt.BorderLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassBorderLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButtonbtnN;
privateJButtonbtnC;
privateJButtonbtnS;
privateJButtonbtnW;
privateJButtonbtnE;
publicBorderLayoutDemo() {
//將容器的布局設(shè)置為邊界布局
pnlMain=newJPanel(newBorderLayout());
btnN=newJButton("按鈕-北");
btnC=newJButton("按鈕-中");
btnS=newJButton("按鈕-南");
btnW=newJButton("按鈕-西");
btnE=newJButton("按鈕-東");
init();
}
privatevoidinit() {
//設(shè)置窗口屬性
this.setTitle("測(cè)試邊界布局");
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
*注意在使用邊界布局的容器時(shí)衣陶,壓入控件要以第2參數(shù)說(shuō)明控件放在哪個(gè)位置;
*否則闸氮,如果沒(méi)有第2參數(shù)剪况,默認(rèn)在中間區(qū)域
*/
pnlMain.add(btnN,BorderLayout.NORTH);
pnlMain.add(btnC,BorderLayout.CENTER);
pnlMain.add(btnS,BorderLayout.SOUTH);
pnlMain.add(btnW,BorderLayout.WEST);
pnlMain.add(btnE,BorderLayout.EAST);
//將容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**創(chuàng)建邊界布局窗口*/
publicstaticvoidmain(String[ ]args) {
newBorderLayoutDemo();
}
}
執(zhí)行結(jié)果如圖所示:
java.awt. GridLayout
網(wǎng)格布局它以矩形網(wǎng)格形式對(duì)容器的控件進(jìn)行布置。容器被分成大小相等的矩形蒲跨,一個(gè)矩形中放置一個(gè)控件译断。 如表5所示,為GridLayout類的構(gòu)造方法或悲。
注意:
使用網(wǎng)格布局時(shí)孙咪,如果控件的數(shù)量過(guò)多或過(guò)少時(shí),網(wǎng)格布局會(huì)自動(dòng)調(diào)整巡语,但是行數(shù)不會(huì)變化翎蹈,如:設(shè)置一個(gè)2行3列的網(wǎng)格,如果壓入控件為7個(gè)男公,那么自動(dòng)變?yōu)?行4列荤堪。
如果在一個(gè)容器中要壓入12個(gè)按鈕,按3行4列排列,如示例3所示澄阳。
【示例3】網(wǎng)格布局
packagecn.sxt.views.testlayout;
importjava.awt.GridLayout;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassGridLayoutDemoextendsJFrame {
privateJPanelpnlMain;
privateJButton[ ]btnS;
publicGridLayoutDemo() {
//將容器的布局設(shè)置為網(wǎng)格布局拥知,指定布局為3行4列
pnlMain=newJPanel(newGridLayout(3, 4));
btnS=newJButton[12];
for(inti= 0;i
btnS[i] =newJButton("按鈕"+(i+1));
}
init();
}
//設(shè)置窗口屬性
this.setTitle("測(cè)試網(wǎng)格布局");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//將控件添加到容器上
for(JButtonbtn:btnS) {
pnlMain.add(btn);
}
//將容器添加到窗口上
this.add(pnlMain);
this.setVisible(true);
}
/**創(chuàng)建網(wǎng)格布局窗口*/
publicstaticvoidmain(String[ ]args) {
newGridLayoutDemo();
}
}
執(zhí)行結(jié)果如圖所示:
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G碎赢,10年Java研發(fā)經(jīng)驗(yàn)低剔,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作揩抡,從小白逐漸做到工程師户侥、高級(jí)工程師镀琉、架構(gòu)師峦嗤。精通Java平臺(tái)軟件開發(fā),精通JAVAEE屋摔,熟悉各種流行開發(fā)框架烁设。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫(kù)從入門到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop