一篇文章帶你了解Java容器,面板及四大布局管理器應(yīng)用
什么是容器?
在Java的GUI界面設(shè)計(jì)中,關(guān)于容器的理解,從字面意思我們就可以認(rèn)為它是存放控件的地方,而這個(gè)地方依托在窗體之上,常用的容器是container。
而關(guān)于container容器我們應(yīng)該有這樣的認(rèn)識:Swing組件中的窗體通常是與容器相關(guān)聯(lián)的,所以在一般情況下,建立完JFrame窗體后,我們會調(diào)用getContentPane()方法將窗體轉(zhuǎn)換為容器,之后再在該容器中添加控件或布局管理器。關(guān)于控件在container容器中添加和刪除用以下兩種方法:
Container.add(); //為容器添加控件
Container.remove(); //為容器添加控件
實(shí)例程序如下:
public class ConJFrame extends JFrame{ public ConJFrame() { setTitle("Container容器"); setSize(400,400); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************在容器中添加一個(gè)標(biāo)簽******************/ JLabel jLabel = new JLabel("這是一個(gè)容器"); jLabel.setBounds(100, 100, 200, 50); container.add(jLabel); //將控件加入到容器 /****************在容器中添加一個(gè)按鈕后移除************/ JButton jButton = new JButton("這是一個(gè)按鈕"); jButton.setBounds(100, 200, 200, 50); container.add(jButton); //將按鈕加入到容器 container.remove(jButton); //將按鈕從容器中移除 setLayout(null); //清空布局管理器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new ConJFrame(); } }
效果如下:
什么是面板?
關(guān)于面板的解釋,你可以認(rèn)為它也是一個(gè)容器,但是這個(gè)容器必須添加在其他的容器中,在Swing中常用的面板有兩種,分別是JPanel面板和JScrollPane面板,下面分別對這兩種面板的用途進(jìn)行介紹:
JPanel面板
在JPanel面板中我們可以添加一些組件來對該面板中的內(nèi)容進(jìn)行布局,之所以它具備這樣的功能,是因?yàn)镴Panel面板同樣也繼承了java.awt.Container類,因此它同樣是具有Container容器的功能,
但是與Container容器不同的就是:Container容器不需要添加在其他容器中,而JPanel面板必須添加在其他容器中。
因此我們可以理解為JPanel面板其實(shí)就是對一個(gè)大的容器的劃分,將Container容器根據(jù)一定的規(guī)則(布局管理)劃分成了一個(gè)個(gè)小的面板。因此JPanel面板的使用一般是與布局管理器相結(jié)合的,
JScrollPane面板
先來看一種在界面設(shè)計(jì)時(shí)常見的問題:在一個(gè)較小的界面中顯示一個(gè)較大的內(nèi)容的情況,對于這種情況,我們常用的方法就是將較小的容器設(shè)置為JScrollPane面板,原因是因?yàn)镴ScrollPane面板是自帶滾動條的,并且同時(shí)它也是一種容器,這也是在做相關(guān)開發(fā)時(shí)我們設(shè)置滾動條常用的一種方法。
使用JScrollPane面板時(shí)需要注意以下兩個(gè)問題:
- JScrollPane面板中只能布置一個(gè)控件,
- JScrollPane面板不能使用布局管理器
因此如果想要在JScrollPane面板中顯示多個(gè)控件,就需要首先將控件布局在JPanel面板中,之后將JPanel面板作為一個(gè)整體組件添加到JScrollPane面板中,
通過下面程序?qū)ScrollPane面板進(jìn)行實(shí)踐:
以下程序是在JScrollPane面板中加入一個(gè)文本框,實(shí)現(xiàn)一個(gè)帶有滾動條的文本框。
public class JScrollPaneClass extends JFrame{ public JScrollPaneClass() { setTitle("JScrollPane面板"); setSize(400,400); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************在JScrollPane面板中添加一個(gè)文本框******************/ JTextArea jTextArea = new JTextArea(); JScrollPane jsp = new JScrollPane(jTextArea); container.add(jsp); //將JScrollPane面板加入容器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new JScrollPaneClass(); } }
效果如下:
什么是布局管理器?
關(guān)于布局管理器,在Swing中,每個(gè)組件都有一個(gè)具體的位置和大小,而在容器中真正去擺放這些組件時(shí)其實(shí)是很難判斷其具體位置和大小的,布局管理器就提供了一種對swing組件的排版方式,因此使用布局管理器就可以很有效的處理整個(gè)窗體中組件的布局方式,Swing提供的常用的布局管理器有四種:絕對布局管理器、流布局管理器、邊界布局管理器、網(wǎng)格布局管理器,接下來會對這四種布局管理器進(jìn)行探討。
絕對布局管理器
除了網(wǎng)格布局管理器、流布局管理器、邊界布局管理器這三種布局方式以外,還有一種較為不同的布局方式就是絕對布局,所謂絕對布局,就是按照一定的坐標(biāo)數(shù)據(jù)將組件的坐標(biāo)和大小硬性的設(shè)置在窗體上。
使用絕對布局時(shí)首先有一點(diǎn)需要注意:
就是要先取消默認(rèn)布局管理器,方法為:
setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器
之后再使用以下方法對組件進(jìn)行絕對定位:
setBounds(x,y,width,height);
//其中x表示組件基于容器左上角的橫坐標(biāo)、y表示縱坐標(biāo),width表示組件的寬,height表示組件的高
請看下面實(shí)例:在容器中采用絕對布局添加三個(gè)控件,并賦于橫縱坐標(biāo)和按鈕的長寬:
public class AbsolutelyLayoutClass extends JFrame{ public AbsolutelyLayoutClass() { setTitle("絕對布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************使用絕對布局管理器布局組件******************/ JButton jb1 = new JButton("這是絕對布局1"); jb1.setBounds(200, 50, 200, 30); //為組件設(shè)置絕對坐標(biāo) container.add(jb1); //將組件添加到容器 JButton jb2 = new JButton("這是絕對布局2"); jb2.setBounds(200, 100, 200, 30); //為組件設(shè)置絕對坐標(biāo) container.add(jb2); //將組件添加到容器 JButton jb3 = new JButton("這是絕對布局3"); jb3.setBounds(200, 150, 200, 30); //為組件設(shè)置絕對坐標(biāo) container.add(jb3); //將組件添加到容器 setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new AbsolutelyLayoutClass(); } }
效果如下:
在使用絕對布局管理器時(shí)值得注意的就是:在使用絕對布局之前要調(diào)用setLayout(null)方法來告知編輯器,這里將不再使用默認(rèn)的布局管理器。
流布局管理器
流布局管理器(FlowLayout)具有的特點(diǎn)就是:在其中的組件可以像“流”一樣按照從左到右的順序依次的排列,直到該行排列完畢后再從下一行繼續(xù)排列。在默認(rèn)的情況下,組將在流布局管理器中都是以居中排列的,當(dāng)然排列的順序是可以改變的,
FlowLayout類中的構(gòu)造函數(shù)中有如下三種:
- Public FlowLayout();
- Public FlowLayout(int alignment);
- Public FlowLayout(int alignment, int horizGap, int vertGap);
以上構(gòu)造函數(shù)中的alignment參數(shù)表示組件在采用流布局管理器后在每一行的具體排放位置??梢再x的值為:
- FlowLayout.LEFT = 0;
- FlowLayout.CENTER = 1;
- FlowLayout.RIGHT = 2;
以上三個(gè)值被賦予以后,表示組件在流布局管理器中每一行的擺放位置和擺放順序,如當(dāng)alignment=0時(shí),流布局管理器中的組件按照從左到右的順序排列,當(dāng)alignment=1時(shí),流布局管理器中的組件按照從中間向兩端的順序排列。
在Public FlowLayout(int alignment, int horizGap, int vertGap);構(gòu)造方法中,后面的參數(shù)horizGap和vertGap分別表示以像素為單位指定組件之間的水平間隔和垂直間隔。
關(guān)于流布局管理器的具體使用可以參考如下實(shí)例:
在該窗體中按照流布局管理器添加10個(gè)按鈕
public class FlowLayoutClass extends JFrame{ public FlowLayoutClass() { setTitle("流布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************使用流布局管理器布局組件******************/ //將容器設(shè)置為從左向右排列、組件水平間隔和垂直間隔分別為10的流布局管理器 container.setLayout(new FlowLayout(0,10,10)); for (int i = 0; i < 10; i++) { container.add(new JButton("流布局按鈕" + i)); } //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { new FlowLayoutClass(); } }
效果如下:
在我們拉動窗體大小變化時(shí),其中的組件也會按照流布局的特點(diǎn)發(fā)生改變,這就驗(yàn)證了流布局管理器中的組件按照從左到右的順序依次擺放,直到該行占滿后再從下一行開始擺放。
邊界布局管理
在默認(rèn)不指定窗體布局的情況下,Swing組件的布局模式就是邊界布局(BorderLayout),該布局管理器的特征就是組件會按照一定要求布滿整個(gè)容器的邊界,
邊界布局管理器可以將容器劃分成東、南、西、北、中五個(gè)區(qū)域,在容器中添加組件時(shí),我們可以設(shè)置組將放入到哪一個(gè)區(qū)域中,關(guān)于區(qū)域的控制可以使用BorderLayout類中的成員方法來確定,關(guān)于這些成員變量的具體含義可以參考下表:
成員變量 |
含義 |
BorderLayout.NORTH |
在容器中添加組件時(shí),組件置于頂端 |
BorderLayout.SOUTH |
在容器中添加組件時(shí),組件置于底端 |
BorderLayout.EAST |
在容器中添加組件時(shí),組件置于右端 |
BorderLayout.WEST |
在容器中添加組件時(shí),組件置于左端 |
BorderLayout.CENTER |
在容器中添加組件時(shí),組件置于中間開始填充,直到與其他組件邊界連接 |
關(guān)于邊界布局管理器的具體使用可以參考如下實(shí)例,將容器劃分為東、南、西、北、中五個(gè)區(qū)域,并在各區(qū)域中添加組件。
public class BorderLayoutClass extends JFrame{ public BorderLayoutClass() { setTitle("邊界布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************使用邊界布局管理器布局組件******************/ //將容器設(shè)置為邊界布局管理器 container.setLayout(new BorderLayout()); container.add(new JButton("我是北部區(qū)域"),BorderLayout.NORTH); //將按鈕加入到北部區(qū)域 container.add(new JButton("我是西部區(qū)域"),BorderLayout.WEST); //將按鈕加入到西部區(qū)域 container.add(new JButton("我是中部區(qū)域"),BorderLayout.CENTER); //將按鈕加入到中部區(qū)域 container.add(new JButton("我是東部區(qū)域"),BorderLayout.EAST); //將按鈕加入到東部區(qū)域 container.add(new JButton("我是南部區(qū)域"),BorderLayout.SOUTH); //將按鈕加入到南部區(qū)域 //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new BorderLayoutClass(); } }
效果如下:
在該方法中直接在add()方法中新建組件,并且在后方加入表示組件位置的參數(shù)。
網(wǎng)格布局管理器
網(wǎng)格布局管理器(GridLayout)從字面意思就可以理解,就是將容器按照行列劃分成特定的網(wǎng)格,在網(wǎng)格布局管理器中每一個(gè)網(wǎng)格的大小都是一樣的,并且網(wǎng)格中格子的個(gè)數(shù)是由劃分的行和列決定的,如一個(gè)兩行兩列的網(wǎng)格布局,將會劃分成四個(gè)大小相同的網(wǎng)格。
在網(wǎng)格布局中的組將會按照從左到右、從上到下的順序加入到網(wǎng)格中,而且加入到網(wǎng)格中的組件都會將網(wǎng)格填滿,同時(shí)改變窗體的大小,網(wǎng)格的大小也會隨之改變。
網(wǎng)格布局中常用的布局管理器有如下兩種:
- Public GridLayout(int rows, int columns);
- Public GridLayout(int rows, int columns, int horizGap, int vertGap);
其中的rows和columns分別表示網(wǎng)格布局的行和列,這兩個(gè)參數(shù)中只有一個(gè)可以為0,表示為一行或一列可以擺放多個(gè)組件,horizGap和vertGap兩個(gè)參數(shù)和流布局管理器中的一樣,只不過在流布局管理器中表示的是組件之間的水平和垂直間距,而在網(wǎng)格布局管理器中表示網(wǎng)格之間的水平和垂直間距,
關(guān)于網(wǎng)格布局管理器的具體使用參考如下實(shí)例,
將容器設(shè)置為4行5列的網(wǎng)格,網(wǎng)格之間的水平和垂直間距為10像素。并在其中加入20個(gè)按鈕
public class GridLayoutClass extends JFrame{ public GridLayoutClass() { setTitle("網(wǎng)格布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變?yōu)槿萜? /****************使用網(wǎng)格布局管理器布局組件******************/ //將容器設(shè)置為4行5列網(wǎng)格布局管理器,網(wǎng)格之間的水平和垂直間距都為10像素 container.setLayout(new GridLayout(4,5,10,10)); for (int i = 0; i < 20; i++) { container.add(new JButton("網(wǎng)格" + i)); } //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設(shè)置窗體可見 setLocationRelativeTo(null); //設(shè)置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設(shè)置窗體關(guān)閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new GridLayoutClass(); } }
效果如下
在拉動窗體改變大小時(shí),網(wǎng)格的大小也會隨之改變。
容器、面板、布局管理器之間的關(guān)系
關(guān)于Swing窗體開發(fā)中的容器、面板、布局管理器之間有如下的關(guān)系:
- 面板應(yīng)該設(shè)置在容器之中,
- 布局管理器可以設(shè)置在容器或面板之中,
- 布局管理器中還可以嵌套面板,在該面板中還可以再添加布局管理器,
- 只有深刻的理解了這三者之間的關(guān)系,才能在窗體開發(fā)中很好的結(jié)合使用。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
java獲取redis日志信息與動態(tài)監(jiān)控信息的方法
這篇文章主要給大家介紹了關(guān)于java如何獲取redis日志信息與動態(tài)監(jiān)控信息的方法,文中介紹的非常詳細(xì),對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04Servlet的兩種創(chuàng)建方式(xml?注解)示例詳解
這篇文章主要為大家介紹了Servlet的兩種創(chuàng)建方式(xml?注解)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Spring MVC處理參數(shù)中的枚舉類型通用實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Spring MVC處理參數(shù)中的枚舉類型通用實(shí)現(xiàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-11-11Spring Security其它權(quán)限校驗(yàn)方式&自定義權(quán)限校驗(yàn)方式
這篇文章主要介紹了Spring Security其它權(quán)限校驗(yàn)方式&自定義權(quán)限校驗(yàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08詳解Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn)
這篇文章主要介紹了Java創(chuàng)建多線程的四種方式以及優(yōu)缺點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11淺談SpringMVC之視圖解析器(ViewResolver)
本篇文章主要介紹了淺談SpringMVC之視圖解析器(ViewResolver),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08java中JSON字符串轉(zhuǎn)換為Map集合的兩種方法
本文主要介紹了java中JSON字符串轉(zhuǎn)換為Map集合,包含了兩種方法,這種需求可能涉及到從外部接口獲取數(shù)據(jù),或者在程序中處理配置信息等,感興趣的可以了解一下2024-07-07