一篇文章帶你瞭解Java容器,面板及四大布局管理器應用
目錄
- 什麼是容器?
- 什麼是面板?
- JPanel面板
- crollPane面板
- 什麼是佈局管理器?
- 絕對佈局管理器
- 流佈局管理器
- 邊界佈局管理
- 網格佈局管理器
- 容器、面板、佈局管理器之間的關係
- 總結
什麼是容器?
在的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,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); //清空佈局管理器,即取消原來的邊界佈局管理器
之後再使用以下方法對元件進行絕對定位:
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,30); //為元件設定絕對座標
container.add(jb1); //將元件新增到容器
JButton jb2 = new JButton("這是絕對佈局2");
jb2.setBounds(200,30); //為元件設定絕對座標
container.add(jb2); //將元件新增到容器
JButton jb3 = new JBuEQjxFgtton("這是絕對佈局3");
jb3.setBounds(200,150,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 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 |
www.cppcns.com
在容器中新增元件時,元件置於左端 |
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 vertGap);
其中的rows和columns分別表示網格佈局的行和列,這兩個引數中只有一個可以為0,表示為一行或一列可以擺放多個元件,horizGap和vertGap兩個引數和流佈局管理器中的一樣,只不過在流佈局管理器中表示的是元件之間的水平和垂直間距,而在網格佈局管理器中表示網格之間的水平和垂直間距,
關於網格佈局管理器的具體使用參考如下例項,
將容器設定為4行5列的網格,網格之間的水平和垂直間距為10畫素。並在其中加入20個按鈕
public class GridLayoutClass extends JFrame{ public GridLayoutClass() { setTitle("網格佈局管理器"); setSize(600,300); Container container = getContentPane(); //將窗體變為容器 /****************使用網格佈局管理器佈局元件***************EQjxFg***/ //將容器設定為4行5列網格佈局管理器,網格之間的水平和垂直間距都為10畫素 container.setLayout(new GridLayout(4,5,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窗體開發中的容器、面板、佈局管理器之間有如下的關係:
- 面板http://www.cppcns.com應該設定在容器之中,
- 佈局管理器可以設定在容器或面板之中,
- 佈局管理器中還可以巢狀面板,在該面板中還可以再添加布局管理器,
- 只有深刻的理解了這三者之間的關係,才能在窗體開發中很好的結合使用。
總結
本篇文章就到這裡了,希望能給你帶來幫助,也希望您能夠多多關注我們的更多內容!