超詳細的Java容器、面板及四大布局管理器應用講解!
本文主要講解Swing程序設計中容器、面板及四大布局管理器的詳細使用、包括實例程序講解、使用注意及使用技巧分享、敬請閱讀!
目錄
什么是容器?
什么是面板?
JPanel面板
JScrollPane面板
什么是布局管理器?
絕對布局管理器
流布局管理器
邊界布局管理
網格布局管理器
容器、面板、布局管理器之間的關系
Hello!你好哇,我是灰小猿!
之前在進行Java的窗體開發時經常會把容器、面板與布局管理混淆,從而不能正確的使用這三種屬性對窗體應用進行布局。所以今天在這里記錄一下Java窗體中容器、面板及常見的四大布局管理器的用法。
什么是容器?
在Java的GUI界面設計中,關于容器的理解,從字面意思我們就可以認為它是存放控件的地方,而這個地方依托在窗體之上,常用的容器是container。
而關于container容器我們應該有這樣的認識:Swing組件中的窗體通常是與容器相關聯的,所以在一般情況下,建立完JFrame窗體后,我們會調用getContentPane()方法將窗體轉換為容器,之后再在該容器中添加控件或布局管理器。關于控件在container容器中添加和刪除用以下兩種方法:
Container.add(); //為容器添加控件
Container.remove(); //為容器添加控件
實例程序如下:
public class ConJFrame extends JFrame{ public ConJFrame() { setTitle("Container容器"); setSize(400,400); Container container = getContentPane(); //將窗體變為容器 /****************在容器中添加一個標簽******************/ JLabel jLabel = new JLabel("這是一個容器"); jLabel.setBounds(100, 100, 200, 50); container.add(jLabel); //將控件加入到容器 /****************在容器中添加一個按鈕后移除************/ JButton jButton = new JButton("這是一個按鈕"); jButton.setBounds(100, 200, 200, 50); container.add(jButton); //將按鈕加入到容器 container.remove(jButton); //將按鈕從容器中移除 setLayout(null); //清空布局管理器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new ConJFrame(); } }
效果如下:
什么是面板?
關于面板的解釋,你可以認為它也是一個容器,但是這個容器必須添加在其他的容器中,在Swing中常用的面板有兩種,分別是JPanel面板和JScrollPane面板,下面分別對這兩種面板的用途進行介紹:
JPanel面板
在JPanel面板中我們可以添加一些組件來對該面板中的內容進行布局,之所以它具備這樣的功能,是因為JPanel面板同樣也繼承了java.awt.Container類,因此它同樣是具有Container容器的功能,
但是與Container容器不同的就是:Container容器不需要添加在其他容器中,而JPanel面板必須添加在其他容器中。
因此我們可以理解為JPanel面板其實就是對一個大的容器的劃分,將Container容器根據一定的規則(布局管理)劃分成了一個個小的面板。因此JPanel面板的使用一般是與布局管理器相結合的,
JScrollPane面板
先來看一種在界面設計時常見的問題:在一個較小的界面中顯示一個較大的內容的情況,對于這種情況,我們常用的方法就是將較小的容器設置為JScrollPane面板,原因是因為JScrollPane面板是自帶滾動條的,并且同時它也是一種容器,這也是在做相關開發時我們設置滾動條常用的一種方法。
使用JScrollPane面板時需要注意以下兩個問題:
JScrollPane面板中只能布置一個控件,
JScrollPane面板不能使用布局管理器
因此如果想要在JScrollPane面板中顯示多個控件,就需要首先將控件布局在JPanel面板中,之后將JPanel面板作為一個整體組件添加到JScrollPane面板中,
通過下面程序對JScrollPane面板進行實踐:
以下程序是在JScrollPane面板中加入一個文本框,實現一個帶有滾動條的文本框。
public class JScrollPaneClass extends JFrame{ public JScrollPaneClass() { setTitle("JScrollPane面板"); setSize(400,400); Container container = getContentPane(); //將窗體變為容器 /****************在JScrollPane面板中添加一個文本框******************/ JTextArea jTextArea = new JTextArea(); JScrollPane jsp = new JScrollPane(jTextArea); container.add(jsp); //將JScrollPane面板加入容器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new JScrollPaneClass(); } }
效果如下:
什么是布局管理器?
關于布局管理器,在Swing中,每個組件都有一個具體的位置和大小,而在容器中真正去擺放這些組件時其實是很難判斷其具體位置和大小的,布局管理器就提供了一種對swing組件的排版方式,因此使用布局管理器就可以很有效的處理整個窗體中組件的布局方式,Swing提供的常用的布局管理器有四種:絕對布局管理器、流布局管理器、邊界布局管理器、網格布局管理器,接下來會對這四種布局管理器進行探討。
絕對布局管理器
除了網格布局管理器、流布局管理器、邊界布局管理器這三種布局方式以外,還有一種較為不同的布局方式就是絕對布局,所謂絕對布局,就是按照一定的坐標數據將組件的坐標和大小硬性的設置在窗體上。
使用絕對布局時首先有一點需要注意:就是要先取消默認布局管理器,方法為:
setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器
至于為什么要這樣做,詳細的解釋可以看我的這篇文章:“盤點Java窗體中關于默認布局管理器容易踩的坑”
之后再使用以下方法對組件進行絕對定位:
setBounds(x,y,width,height);
//其中x表示組件基于容器左上角的橫坐標、y表示縱坐標,width表示組件的寬,height表示組件的高
請看下面實例:在容器中采用絕對布局添加三個控件,并賦于橫縱坐標和按鈕的長寬:
public class AbsolutelyLayoutClass extends JFrame{ public AbsolutelyLayoutClass() { setTitle("絕對布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變為容器 /****************使用絕對布局管理器布局組件******************/ JButton jb1 = new JButton("這是絕對布局1"); jb1.setBounds(200, 50, 200, 30); //為組件設置絕對坐標 container.add(jb1); //將組件添加到容器 JButton jb2 = new JButton("這是絕對布局2"); jb2.setBounds(200, 100, 200, 30); //為組件設置絕對坐標 container.add(jb2); //將組件添加到容器 JButton jb3 = new JButton("這是絕對布局3"); jb3.setBounds(200, 150, 200, 30); //為組件設置絕對坐標 container.add(jb3); //將組件添加到容器 setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new AbsolutelyLayoutClass(); } }
效果如下:
在使用絕對布局管理器時值得注意的就是:在使用絕對布局之前要調用setLayout(null)方法來告知編輯器,這里將不再使用默認的布局管理器。
流布局管理器
流布局管理器(FlowLayout)具有的特點就是:在其中的組件可以像“流”一樣按照從左到右的順序依次的排列,直到該行排列完畢后再從下一行繼續排列。在默認的情況下,組將在流布局管理器中都是以居中排列的,當然排列的順序是可以改變的,
FlowLayout類中的構造函數中有如下三種:
Public FlowLayout();
Public FlowLayout(int alignment);
Public FlowLayout(int alignment, int horizGap, int vertGap);
以上構造函數中的alignment參數表示組件在采用流布局管理器后在每一行的具體排放位置。可以賦的值為:
FlowLayout.LEFT = 0;
FlowLayout.CENTER = 1;
FlowLayout.RIGHT = 2;
以上三個值被賦予以后,表示組件在流布局管理器中每一行的擺放位置和擺放順序,如當alignment=0時,流布局管理器中的組件按照從左到右的順序排列,當alignment=1時,流布局管理器中的組件按照從中間向兩端的順序排列。
在Public FlowLayout(int alignment, int horizGap, int vertGap);構造方法中,后面的參數horizGap和vertGap分別表示以像素為單位指定組件之間的水平間隔和垂直間隔。
關于流布局管理器的具體使用可以參考如下實例:
在該窗體中按照流布局管理器添加10個按鈕
public class FlowLayoutClass extends JFrame{ public FlowLayoutClass() { setTitle("流布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變為容器 /****************使用流布局管理器布局組件******************/ //將容器設置為從左向右排列、組件水平間隔和垂直間隔分別為10的流布局管理器 container.setLayout(new FlowLayout(0,10,10)); for (int i = 0; i < 10; i++) { container.add(new JButton("流布局按鈕" + i)); } //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { new FlowLayoutClass(); } }
效果如下:
在我們拉動窗體大小變化時,其中的組件也會按照流布局的特點發生改變,這就驗證了流布局管理器中的組件按照從左到右的順序依次擺放,直到該行占滿后再從下一行開始擺放。
邊界布局管理
在默認不指定窗體布局的情況下,Swing組件的布局模式就是邊界布局(BorderLayout),該布局管理器的特征就是組件會按照一定要求布滿整個容器的邊界,
邊界布局管理器可以將容器劃分成東、南、西、北、中五個區域,在容器中添加組件時,我們可以設置組將放入到哪一個區域中,關于區域的控制可以使用BorderLayout類中的成員方法來確定,關于這些成員變量的具體含義可以參考下表:
成員變量
含義
BorderLayout.NORTH
在容器中添加組件時,組件置于頂端
BorderLayout.SOUTH
在容器中添加組件時,組件置于底端
BorderLayout.EAST
在容器中添加組件時,組件置于右端
BorderLayout.WEST
在容器中添加組件時,組件置于左端
BorderLayout.CENTER
在容器中添加組件時,組件置于中間開始填充,直到與其他組件邊界連接
關于邊界布局管理器的具體使用可以參考如下實例,將容器劃分為東、南、西、北、中五個區域,并在各區域中添加組件。
public class BorderLayoutClass extends JFrame{ public BorderLayoutClass() { setTitle("邊界布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變為容器 /****************使用邊界布局管理器布局組件******************/ //將容器設置為邊界布局管理器 container.setLayout(new BorderLayout()); container.add(new JButton("我是北部區域"),BorderLayout.NORTH); //將按鈕加入到北部區域 container.add(new JButton("我是西部區域"),BorderLayout.WEST); //將按鈕加入到西部區域 container.add(new JButton("我是中部區域"),BorderLayout.CENTER); //將按鈕加入到中部區域 container.add(new JButton("我是東部區域"),BorderLayout.EAST); //將按鈕加入到東部區域 container.add(new JButton("我是南部區域"),BorderLayout.SOUTH); //將按鈕加入到南部區域 //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new BorderLayoutClass(); } }
效果如下:
在該方法中直接在add()方法中新建組件,并且在后方加入表示組件位置的參數。
網格布局管理器
網格布局管理器(GridLayout)從字面意思就可以理解,就是將容器按照行列劃分成特定的網格,在網格布局管理器中每一個網格的大小都是一樣的,并且網格中格子的個數是由劃分的行和列決定的,如一個兩行兩列的網格布局,將會劃分成四個大小相同的網格。
在網格布局中的組將會按照從左到右、從上到下的順序加入到網格中,而且加入到網格中的組件都會將網格填滿,同時改變窗體的大小,網格的大小也會隨之改變。
網格布局中常用的布局管理器有如下兩種:
Public GridLayout(int rows, int columns);
Public GridLayout(int rows, int columns, int horizGap, int vertGap);
其中的rows和columns分別表示網格布局的行和列,這兩個參數中只有一個可以為0,表示為一行或一列可以擺放多個組件,horizGap和vertGap兩個參數和流布局管理器中的一樣,只不過在流布局管理器中表示的是組件之間的水平和垂直間距,而在網格布局管理器中表示網格之間的水平和垂直間距,
關于網格布局管理器的具體使用參考如下實例,
將容器設置為4行5列的網格,網格之間的水平和垂直間距為10像素。并在其中加入20個按鈕
public class GridLayoutClass extends JFrame{ public GridLayoutClass() { setTitle("網格布局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變為容器 /****************使用網格布局管理器布局組件******************/ //將容器設置為4行5列網格布局管理器,網格之間的水平和垂直間距都為10像素 container.setLayout(new GridLayout(4,5,10,10)); for (int i = 0; i < 20; i++) { container.add(new JButton("網格" + i)); } //setLayout(null); //清空布局管理器,即取消原來的邊界布局管理器 setVisible(true); //設置窗體可見 setLocationRelativeTo(null); //設置窗體居中 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設置窗體關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new GridLayoutClass(); } }
效果如下
在拉動窗體改變大小時,網格的大小也會隨之改變。
容器、面板、布局管理器之間的關系
關于Swing窗體開發中的容器、面板、布局管理器之間有如下的關系:
面板應該設置在容器之中,
布局管理器可以設置在容器或面板之中,
布局管理器中還可以嵌套面板,在該面板中還可以再添加布局管理器,
只有深刻的理解了這三者之間的關系,才能在窗體開發中很好的結合使用。
覺得有用記得關注喲!
大灰狼期待與你一同進步^ω^
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。