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