常用佈局管理器
在Swing中,每個元件在容器中都有一個具體的位置和大小,而在容器中擺放各種元件很難判斷其位置和大小。佈局管理器提供了Swing元件安排、展示在容器中的方法及基本的佈局功能。
使用佈局管理器與直接在容器中控制Swing元件的位置和大小方便的多,可以有效的管理整個佈局。Swing提供的常用佈局管理器包括流佈局管理器、邊界佈局管理器和網格佈局管理器。
絕對佈局
在Swing中,除了使用佈局管理器之外還可以使用絕對佈局。
絕對佈局,就是硬性指定元件在容器中的位置和大小,可以使用絕對座標的方式來指定元件的位置。
使用絕對佈局的步驟如下:
-
使用Container.setLayout(null) 方法取消佈局管理器。
-
使用Component.setBounds()方法設定每個元件的大小與位置
import java.awt.*; import javax.swing.*; public class AbsoulutePosition extends JFrame{ public AbsoulutePosition() { setTitle("本窗體使用絕對佈局"); //設定該窗體的標題 setLayout(null); // 使該窗體取消佈局管理器的設定 setBounds(0,0,200,150); //絕對定位窗體的位置與大小 Container c = getContentPane(); //建立容器物件 JButton jb1 = new JButton("按鈕1"); //建立按鈕1 JButton jb2 = new JButton("按鈕2"); //建立按鈕2 jb1.setBounds(10,30,80,30); //設定按鈕1位置與大小 jb2.setBounds(60,70,100,20); //設定按鈕2位置與大小 c.add(jb1); //將按鈕1新增到容器中 c.add(jb2); //將按鈕2新增到容器中 setVisible(true); //設定容器可見性 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設定容器關閉方式 } public static void main(String[] args) { // TODO Auto-generated method stub new AbsoulutePosition(); } }
執行結果如下:
在本例項中,窗體的大小、位置以及窗體內元件的大小與位置都被進行絕對佈局操作。絕對佈局使用setBounds(intx, int y, int width, int height)方法進行設定,如果使窗體物件呼叫setBounds()方法,它的x y 引數代表窗體在整個螢幕中的位置,width height代表窗體的寬與長。如果使窗體內的元件呼叫setBounds()方法,x,y引數代表;這個元件在整個窗體中的位置,width height代表元件的寬與長。
Note:
在使用絕對佈局之前,需要呼叫setLayout(null)方法告知編譯器,這裡不再使用佈局管理器。
流佈局管理器(FlowLayout)
流佈局管理器是最基本的佈局管理器,在整個容器中的佈局正如其名,像“流”一樣從左到右擺放元件,知道佔據了這一行的所有空間,然後再向下一行移動。預設情況下,元件在每一行都是居中排列的,但是通過設定也可以更改元件在每一行上的擺放位置。
import java.awt.*;
import javax.swing.*;
public class FlowLayoutPosition extends JFrame {
public FlowLayoutPosition() {
setTitle("本視窗使用流佈局管理器"); //設定窗體標題
Container c = getContentPane(); //建立容器
//設定窗體使用流佈局管理器,是元件左對齊,並且設定元件之間的水平和垂直距離
setLayout(new FlowLayout(1,10,10));
for(int i = 0; i<10; i++) {
c.add(new JButton("button" + i)); //建立9個button
}
setSize(300,200); //設定容器大小
setVisible(true); //設定容器可見
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設定窗體關閉方式
}
public static void main(String[] args) {
new FlowLayoutPosition(); //建立一個FlowLayoutPosition物件
}
}
執行結果如下:
本例項的結果可以看出,如果改變整個成窗體的大小,其中元件的位置也會相應的改變,正好驗證了使用流佈局管理器元件從左到右擺放,當元件填滿一行後,自動換行,直到所有的元件都擺放在容器中為止。
邊界佈局管理器
在預設不指定窗體佈局的情況下,Swing元件的佈局模式是邊界(BorderLayout)佈局管理器。在之前的例子中,有出現在容器中只新增一個標籤元件,在執行結果中該元件被放置在窗體中間,並且整個元件佔據了窗體的所有空間,實質上容器中預設的使用了邊界佈局管理器。
但是邊界佈局管理器的功能不止如此,還可以將容器劃分為:東、南、西、北、中五個區域,可以將元件放入這五個區域當中。容器呼叫container.add()方法新增元件時候可以設定次元件在邊界佈局管理器當中的位置。區域控制可以使用BorderLayout類中的成員變數來決定。
下面看一個例子:
import java.awt.BorderLayout;
import java.awt.*;
import javax.swing.*;
public class BorderLayoutPosition extends JFrame {
//定義元件擺放位置的陣列
String[] border = {BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.SOUTH,
BorderLayout.WEST,BorderLayout.EAST};
//定義按鈕名稱
String[] buttonName = {"center button","north button",
"south button","west button","east button"};
//自定義類BorderLayoutPosition的建構函式
public BorderLayoutPosition() {
setTitle("這個視窗使用的是邊界佈局管理器"); //設定標題
Container container = getContentPane(); //定義一個容器
setLayout(new BorderLayout()); //設定容器為邊界佈局管理器
for(int i = 0; i< border.length; i++) { //在迴圈中為容器新增按鈕,並設定按鈕佈局
container.add(border[i], new JButton(buttonName[i]));
}
setSize(350,200); //設定容器大小
setVisible(true); //設定容器可見
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //設定容器關閉方式
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new BorderLayoutPosition();
}
}
執行結果為:
在本例項中,將佈局以及元件名稱分別設定在陣列中,然後設定容器使用便捷佈局管理器,最後在迴圈中將按鈕新增到容器中,並設定元件佈局。
網格佈局管理器
網格佈局管理器將容器劃分為網格,所以元件可以按照行或者列進行排列。
在網格中,每個元件大小相同,並且網格中空格的個數由網格的行數和列數決定。
接下來看一個實際的例子:
import java.awt.*;
import javax.swing.*;
public class GridLayoutPosition extends JFrame {
public GridLayoutPosition() {
setTitle("這個視窗使用過網格佈局管理器");
Container container = getContentPane();
setLayout(new GridLayout(7,3,5,5)); //設定容器使用網格佈局,並且設定為7行3列的網格
for(int i = 0; i<=20; i++) { //在容器中新增按鈕
container.add(new JButton("button" + i));
}
setSize(400,400);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new GridLayoutPosition();
}
}
執行結果如下: