(轉(zhuǎn))原文地址:http://blog.csdn.net/chongtianfeiyu/article/details/8220454 GridBagLayout布局管理器: 這就是最復(fù)雜的一個布局管理器了,網(wǎng)格包布局.在此布局中,組件大小不必相同. GridBagLayout gb=new GridBagLayout(); ContainerName.setLayout(gb); 以上代碼是讓容器獲得一個GridBagLayout.要使用網(wǎng)格包布局,還必須有其一個輔助類,GridBagContraints.它包含GridBagLayout類用來定位及調(diào)整組件大小所需要的全部信息.使用步驟如下: 1).創(chuàng)建網(wǎng)格包布局的一個實例,并將其定義為當(dāng)前容器的布局管理器. 2).創(chuàng)建GridBagContraints的一個實例 3).為組件設(shè)置約束. 4).通過方法統(tǒng)治布局管理器有關(guān)組件及其約束等信息 5).將組件添加到容器. 6).對各個將被顯示的組件重復(fù)以上步驟. GridBagContraints類的成員變量列表如下: 1,、gridx—組件的橫向坐標(biāo); 2,、girdy—組件的縱向坐標(biāo),; gridx=0,gridy=0時放在0行0列,GridBagConstraints.RELATIVE為默認(rèn)值,,表明當(dāng)前組件緊跟在上一個組件之后,。如果在行上不指定該值(同時也不指定gridx和gridy參數(shù)),那么無論添加多少個組件都是在同一行上 3、gridwidth——組件的橫向?qū)挾?,也就是指組件占用的列數(shù),,這與HTML的colspan類似; 4,、gridheight—組件的縱向長度,,也就是指組件占用的行數(shù),這與HTML的rowspan類似,; 設(shè)置組件橫向縱向跨越多少個網(wǎng)格,,他們的默認(rèn)值都是1,如果該組件是橫向或縱向的最后一個還可以將此值設(shè)為GridBagConstraints.REMAINDER,,若為倒數(shù)第二個組件則可以設(shè)值為GridBagConstraints.RELATIVE,。 gridwidth能否能夠保留住該寬度取決于其正上/下方相應(yīng)位置是否有足夠的組件來占位,如果無,,位置將會被壓縮,。比如,,設(shè)置 gridwidth=3,,但只添加了一個JButton,這時如果其上下方相應(yīng)位置沒有其他組件或只有1個組件,,那么它只占有1個網(wǎng)格大小,。如果它上/下 方相應(yīng)位置有3個組件,那它就可以占3個網(wǎng)格大小了,。如果它上/下方相應(yīng)位置只有2個組件,,那它就占2個網(wǎng)格大小。 gridheight能否保留住該高度取決于其左右兩邊是否有足夠的組件來占位,。也就是說它的最大高度不大于左右兩邊最大的高度,。比如,設(shè)置gridheight=3,,如果左右兩邊組件只有1行,,則它僅僅只有1行的高度,有2行則占2行的高度,。 5,、weightx—指行的權(quán)重,告訴布局管理器如何分配額外的水平空間,; 6,、weighty—指列的權(quán)重,告訴布局管理器如何分配額外的垂直空間,; 用來設(shè)置窗口變大時,,各組件跟著變大的比例。當(dāng)數(shù)字越大,表示組件能得到更多的空間,,默認(rèn)值皆為0,。比如組件A的weightx=0.5,組件B的weightx=1,,那么窗口X軸變大時剩余的空間就會以1:2的比例分配給組件A和B,; 7、anchor—告訴布局管理器組件在表格空間中的位置,當(dāng)組件小于其顯示區(qū)域時使用此字段,; 有CENTER(默認(rèn)值),、NORTH、NORTHEAST,、EAST,、SOUTHEAST、WEST,、NORTHWEST選擇,。 8、fill—如果顯示區(qū)域比組件的區(qū)域大的時候,,可以用來控制組件的行為,。控制組件是垂直填充,,還是水平填充,,或者兩個方向一起填充; 9,、insets—指組件與表格空間四周邊緣的空白區(qū)域的大小,內(nèi)邊距,,算入組件自身大小中。它有四個參數(shù),,分別是上,,左,下,,右,,默認(rèn)為(0,0,0,0)。 10,、ipadx— 組件間的橫向間距,,組件的寬度就是這個組件的最小寬度加上ipadx值; 11,、ipady— 組件間的縱向間距,,組件的高度就是這個組件的最小高度加上ipady值。 外邊距,,最終組件占用的大小是組件自身大小加上外邊距,。 所以,,如果我們已經(jīng)明白了GridBagConstraints的詳細(xì)用法了,那么現(xiàn)在就讓我們來看看在實際應(yīng)用中應(yīng)該如何來實現(xiàn)它: tagLbl = new JLabel("Tags"); c.gridx = 0; //x grid position c.gridy = 0; //y grid position gridbag.setConstraints(tagLbl, c); //設(shè)置標(biāo)簽的限制 contentPane.add(tagLbl); //增加到內(nèi)容面板 我們所做的是示例我們的標(biāo)簽,、分配給它一個格位置,,將它與一個約束對象聯(lián)系起來并把它增加到我們的內(nèi)容面板中。 tagModeLbl = new JLabel("Tag Mode"); c.gridx = 0; c.gridy = 1; gridbag.setConstraints(tagModeLbl, c); contentPane.add(tagModeLbl); 請注意,,雖然我們已經(jīng)在我們的約束對象中把gridx的值設(shè)置為0,,但是在這里我們?nèi)匀灰獙λM(jìn)行重新設(shè)置——這樣做沒有其它原因,只是為了增加可讀性,。 CardLayout布局管理器: CardLayout布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據(jù)整個容器的大小,但是每層 只允許放置一個組件,當(dāng)然每層都可以利用Panel來實現(xiàn)復(fù)雜的用戶界面.布局管理器(CardLayout)就象一副疊得整整齊齊的撲克牌一樣,有54 張牌,但是你只能看見最上面的一張牌,每一張牌就相當(dāng)于布局管理器中的每一層.其實現(xiàn)過程如下: //首先,定義面板,為個個面板設(shè)置不同的布局,并根據(jù)需要在每個面板中放置組件: panelOne.setLayout(new FlowLayout); panelTwo.setLayout(new GridLayout(2,1)); //再設(shè)置主面板. CardLayout card = new CardLayout(); panelMain.setLayout(card); //下一步將開始準(zhǔn)備好的面板添加到主面板 panelMain.add("red panel",panelOne); panelMain.add("blue panel",panelTwo); //add()方法帶有兩個參數(shù),第一個為String類型用來表示面板標(biāo)題,第二個為Panel對象名稱. //完成以上步驟以后,必須給用戶提供在卡片之間進(jìn)行選擇的方法.一個常用的方法是每張卡片都包含一個按鈕.通常用來控制顯示哪張面板.actionListener被添加到按鈕..actionPerformed()方法可定義顯示哪張卡片.: card.next(panelMain); //下一個 card.previous(panelMain); //前一個 card.first(panelMain); //第一個 card.last(panelMain); //最后一個 card.show(panelMain,"red panel"); //特定面板 示例 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class calculator{ Frame f; Panel p1; Panel p2; String[] name = {"1","2","3","4","5"}; CardLayout c; public void init(){ f = new Frame("yz"); p1 = new Panel(); p2 = new Panel(); c = new CardLayout(); p1.setLayout(c); for(int i=0;i<name .length;i++){ p1.add(name[i],new Button(name[i])); } //控制顯示上一張的按鈕 Button previous = new Button("上一張"); previous.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ c.previous(p1); } }); //控制顯示下一張的按鈕 Button next = new Button("下一張"); next.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { c.next(p1); } }); //控制顯示第一張的按鈕 Button first = new Button("第一張"); first.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ c.first(p1); } }); //控制顯示最后一張的按鈕 Button last = new Button("最后一張"); last.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ c.last(p1); } }); //根據(jù)card名顯示的按鈕 Button third = new Button("第三張"); third.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ c.show(p1,"3"); } }); p2.add(previous); p2.add(next); p2.add(first); p2.add(last); p2.add(third); f.add(p1);//默認(rèn)添加到中間 f.add(p2,BorderLayout.SOUTH); f.pack(); f.setVisible(true); } public static void main(String[] args){ new calculator().init(); } }
BorderLayout布局管理器:
BorderLayout 也是一種非常簡單的布局策略,,它把容器內(nèi)的空間簡單地劃分為:North,South,East,West和Center 5個區(qū)域,每加入一個組件都應(yīng)該指明把這個組件加在哪個區(qū)域中,。BorderLayout是頂層容器(Window,,F(xiàn)rame, Dialog)的默認(rèn)布局管理器。 BorderLayout界面最多只能顯示5個控件,若在一個區(qū)域中加上多個component,,則只有最后加上的那個是可見的,。加入控件的時候,可以指定加入的方位,,默認(rèn)的情況是加入到中間,。 當(dāng)容器的大小發(fā)生變化時,用BorderLayout管理的組件會發(fā)生變化,其變化規(guī)律是:組件的相對位置不變,大小發(fā)生變化.例如容器變高了,則 North、South 區(qū)域不變,West,、Center,、East區(qū)域變高;如果容器變寬了,West,、East區(qū)域不變,North,、Center、South區(qū)域變寬.不 一定所有的區(qū)域都有組件,如果四周的區(qū)域(West,、East,、North、South區(qū)域)沒有組件,則由Center區(qū)域去補(bǔ)充,但是如果 Center區(qū)域沒有組件,則保持空白. //使用BorderLayout的構(gòu)造方法,,可設(shè)置其component的間距,。如: BorderLayout(); //component間沒有間距 BorderLayout(int hgap,int vgap); // hgap和vgap分別對應(yīng)水平和垂直方向的間距。 import java.awt.*; public class buttonDir{ public static void main(String args[]){ Frame f = new Frame("BorderLayout"); f.setLayout(new BorderLayout()); f.add("North", new Button("North"); f.add("South", new Button("South"); f.add("East", new Button("East"); f.add("West", new Button("West"); f.add("Center", new Button("Center"); f.setSize(200,200); f.setVisible(true); } } FlowLayout布局管理器: 流式布局管理器把容器看成一個行集,,好象平時在一張紙上寫字一樣,,一行寫滿就換下一行。行高是用一行中的控件高度決定的,。FlowLayout是 Panel的默認(rèn)布局,。在生成流式布局時能夠指定顯示的對齊方式,默認(rèn)情況下是居中(FlowLayout.CENTER),。當(dāng)容器的大小發(fā)生變化時,用 FlowLayout管理的組件會發(fā)生變化,其變化規(guī)律是:組件的大小不變,但是相對位置會發(fā)生變化. FlowLayout() //生成一個默認(rèn)的流式布局,組件在容器里居中,每個組件之間留下5個像素的距離. FlowLayout(int alinment) //align決定component的位置,,其值有FlowLayout.LEFT FlowLayout(int alignment,int hgap,int vgap) //hgap和vgap分別對應(yīng)水平和垂直方向的間距,,缺省為5單位(unit) GirdLayout布局管理器: Grid布局管理器提供了放置component的靈活手段。程序員可以建立一個有多行和多列的布局管理器,,然后component就可以按一定的次序(從左到右,,從上到下)進(jìn)行排列。 當(dāng)Grid布局管理器對應(yīng)的窗口發(fā)生變化時,,內(nèi)部component的相對位置并不變化,,只有大小發(fā)生變化。 Grid布局管理器總是忽略component傾向的大小(prefered size),,它把每個component的大小設(shè)置成相同的,。 GridLayout() //缺省建立一行的布局,每個component占居一列 GridLayout(int rows, int cols) //建立指定行和列的布局,,rows和cols對應(yīng)行數(shù)和列數(shù) GridLayout(int rows, int cols, int hgap, int vgap) //建立指定行列數(shù)和間距的布局,,hgap和vgap分別對應(yīng)水平和垂直間距。 當(dāng)控件數(shù)多于或少于構(gòu)造函數(shù)里的行數(shù)和列數(shù)時,,行數(shù)時固定的,,列數(shù)根據(jù)情況增減。另,,構(gòu)造函數(shù)里的行數(shù)和列數(shù)能夠有一個為零,,但是不能都為零。當(dāng)容器里增加控件時候,,容器內(nèi)將向0的那個方向增長,。 |
|