三、布局管理器
Swing中,每個組件在容器中都有一個具體的位置和大小,在容器中擺放各自組件時很難判斷其具體位置和大小,這里我們就要引入布局管理器了,它提供了基本的布局功能,可以有效的處理整個窗體的布局。常用的布局管理器包括流布局管理器、邊界布局管理器、網格布局管理器等。
1. 絕對布局
絕對布局在上一篇的例子中已經出現過了,是硬性指定組件在容器中的位置和大小,可以使用絕對坐標的方式來指定組件的位置。步驟如下:
(1)使用Container.setLayout(null)方法取消布局管理器
(2)使用Container.setBounds()方法設置每個組件的位置和大小
舉一個簡單的例子:
Container container = getContentPane(); // 創建容器 JButton jb = new JButton("按鈕"); // 創建按鈕 jb.setBounds(10, 30, 100, 30); // 設置按鈕位置和大小 container.add(jb); // 將按鈕添加到容器中
setBounds()方法中,前兩個參數是位置的xy坐標,后兩個參數是按鈕的長和寬。
2. 流布局管理器
流布局管理器是布局管理器中最基本的布局管理器,使用FlowLayout類,像“流”一樣從左到右擺放組件,直到占據了這一行的所有空間,再向下移動一行。組件在每一行的位置默認居中排列,要更改位置可自行設置。
在FlowLayout的有參構造方法中,alignment設置為0時,每一行的組件將被指定左對齊排列;當alignment被設置為2時,每一行的組件將被指定右對齊排列;而為1時是默認的居中排列。
下面舉個例子,創建10個按鈕並用流布局管理器排列。
1 import java.awt.Container; 2 import java.awt.FlowLayout; 3 4 import javax.swing.JButton; 5 import javax.swing.JFrame; 6 import javax.swing.WindowConstants; 7 8 public class FlowLayoutDemo extends JFrame { 9 10 public FlowLayoutDemo() { 11 Container container = this.getContentPane(); 12 // 設置流布局管理器,2是右對齊,后兩個參數分別為組件間的水平間隔和垂直間隔 13 this.setLayout(new FlowLayout(2, 10, 10)); 14 15 // 循環添加按鈕 16 for(int i=0; i<10; i++) { 17 container.add(new JButton("按鈕" + i)); 18 } 19 20 this.setSize(300, 200); 21 this.setVisible(true); 22 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 23 } 24 25 public static void main(String[] args) { 26 new FlowLayoutDemo(); 27 } 28 29 }
第一個參數為2是右對齊,每個按鈕間的水平、垂直間隔都為10。后兩個圖分別為參數為1居中排列和參數為0左對齊。運行結果如下:

3. 邊界布局管理器
在不指定窗體布局時,Swing組件默認的布局管理器是邊界布局管理器,使用的是BorderLayout類。在上篇例子中,一個JLabel標簽占據了整個空間,實質上是默認使用了邊界布局管理器。邊界布局管理器還可以容器分為東、南、西、北、中五個區域,可以將組件加入這五個區域中。
下面舉一個實例。
1 import java.awt.BorderLayout; 2 import java.awt.Container; 3 4 import javax.swing.JButton; 5 import javax.swing.JFrame; 6 import javax.swing.WindowConstants; 7 8 public class BorderLayoutDemo extends JFrame { 9 10 private String[] border = {BorderLayout.CENTER, BorderLayout.NORTH, 11 BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST}; // 此數組用於存放組件擺放位置 12 private String[] button = {"中", "北", "南", "西", "東"}; // 此數組用於存放按鈕名稱 13 14 public BorderLayoutDemo() { 15 Container container = this.getContentPane(); 16 this.setLayout(new BorderLayout()); // 設置容器為邊界布局管理器 17 18 // 循環添加按鈕 19 for(int i=0; i<button.length ; i++) { 20 container.add(border[i], new JButton(button[i])); // 左參數為設置布局,右參數為創建按鈕 21 } 22 23 this.setVisible(true); 24 this.setSize(300, 200); 25 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 26 } 27 28 public static void main(String[] args) { 29 new BorderLayoutDemo(); 30 } 31 32 }
運行結果如下:

4. 網格布局管理器
網格布局管理器將容器划分為網格,組件按行按列排列,使用GridLayout類。在此布局管理器中,每個組件的大小都相同,且會填滿整個網格,改變窗體大小,組件也會隨之改變。
下面看一個實例。
1 import java.awt.Container; 2 import java.awt.GridLayout; 3 4 import javax.swing.JButton; 5 import javax.swing.JFrame; 6 import javax.swing.WindowConstants; 7 8 public class GirdLayoutDemo extends JFrame { 9 10 public GirdLayoutDemo() { 11 Container container = this.getContentPane(); 12 this.setLayout(new GridLayout(7, 3, 5, 5)); // 前兩個參數為7行3列,后兩個參數為網格間的間距 13 14 for(int i=0; i<20; i++) { 15 container.add(new JButton("按鈕" + i)); 16 } 17 18 this.setVisible(true); 19 this.setSize(300, 300); 20 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 21 } 22 23 public static void main(String[] args) { 24 new GirdLayoutDemo(); 25 } 26 27 }
運行結果如下,網格共7行3列,網格間的橫向、縱向間距都為5:

四、面板
面板也是一個容器,可作為容器容納其他組件,但也必須被添加到其他容器中。Swing中常用面板有JPanel面板和JScrollPane面板。
1. JPanel
JPanel面板可以聚集一些組件來布局。繼承自java.awt.Container類。
下面舉個例子。
1 import java.awt.Container; 2 import java.awt.GridLayout; 3 4 import javax.swing.JButton; 5 import javax.swing.JFrame; 6 import javax.swing.JPanel; 7 import javax.swing.WindowConstants; 8 9 public class JPanelDemo extends JFrame { 10 11 public JPanelDemo() { 12 Container container = this.getContentPane(); 13 container.setLayout(new GridLayout(2, 1, 10, 10)); // 整個容器為2行1列 14 15 JPanel p1 = new JPanel(new GridLayout(1, 3)); // 初始化一個面板,設置1行3列的網格布局 16 JPanel p2 = new JPanel(new GridLayout(1, 2)); // 初始化一個面板,設置1行2列的網格布局 17 JPanel p3 = new JPanel(new GridLayout(2, 1)); // 初始化一個面板,設置2行1列的網格布局 18 JPanel p4 = new JPanel(new GridLayout(3, 2)); // 初始化一個面板,設置3行2列的網格布局 19 20 p1.add(new JButton("1")); // 在JPanel面板中添加按鈕 21 p1.add(new JButton("1")); // 在JPanel面板中添加按鈕 22 p1.add(new JButton("1")); // 在JPanel面板中添加按鈕 23 p2.add(new JButton("2")); // 在JPanel面板中添加按鈕 24 p2.add(new JButton("2")); // 在JPanel面板中添加按鈕 25 p3.add(new JButton("3")); // 在JPanel面板中添加按鈕 26 p3.add(new JButton("3")); // 在JPanel面板中添加按鈕 27 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 28 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 29 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 30 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 31 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 32 p4.add(new JButton("4")); // 在JPanel面板中添加按鈕 33 34 container.add(p1); // 在容器中添加面板 35 container.add(p2); // 在容器中添加面板 36 container.add(p3); // 在容器中添加面板 37 container.add(p4); // 在容器中添加面板 38 39 this.setVisible(true); 40 this.setSize(500, 350); 41 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 42 } 43 44 public static void main(String[] args) { 45 new JPanelDemo(); 46 } 47 48 }
運行結果如下,可自行對比代碼與結果理解JPanel。其中,容器的GridLayout布局設置了橫縱都為10的間距,JPanel的GridLayout布局沒有設置網格間距。

2. JScrollPane
若遇到一個較小的容器窗體中顯示一個較大部分內容的情況,可用JScrollPane面板。這是一個帶滾動條的面板,就像平時瀏覽網頁,經常遇到的滾動條一樣。
如果需要在JScrollPane面板中放置多個組件,需將這多個組件放置在JPanel面板上,然后將JPanel面板作為一個整體組件添加在JScrollPane面板上。
下面看一個例子。
1 import java.awt.Container; 2 3 import javax.swing.JFrame; 4 import javax.swing.JPanel; 5 import javax.swing.JScrollPane; 6 import javax.swing.JTextArea; 7 import javax.swing.ScrollPaneConstants; 8 import javax.swing.WindowConstants; 9 10 public class JScrollPaneDemo extends JFrame { 11 12 public JScrollPaneDemo() { 13 Container container = this.getContentPane(); 14 15 JTextArea tArea = new JTextArea(20, 50); // 創建文本區域組件 16 tArea.setText("http://www.cnblogs.com/adamjwh/"); 17 18 JScrollPane sp = new JScrollPane(tArea); 19 container.add(sp); 20 21 this.setVisible(true); 22 this.setSize(300, 150); 23 this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 24 } 25 26 public static void main(String[] args) { 27 new JScrollPaneDemo(); 28 } 29 30 }
其中JTextArea是創建一個文本區域組件,大小為20*50,setText()方法是給該文本區域填值。這里在new一個JScrollPane時,就將文本區域組件添加到其上。運行結果如下:

如果要控制滾動條是否出現等,可查看API直接使用相應方法。
五、按鈕組件
1. 提交按鈕組件(JButton)
JButton在之前的例子中已經出現多次,是較為常用的組件,用於觸發特定動作。可以在按鈕上顯示文本標簽,還可以顯示圖標,如下:
JButton jb = new JButton(); jb.setIcon(icon); // 設置圖標 jb.setToolTipText("圖片按鈕"); // 設置按鈕提示
2. 單選按鈕組件(JRadioButton)
默認情況下,單選按鈕顯示一個圓形圖標,通常在其旁放置一些說明性文字。當用戶選中某個單選按鈕后,按鈕組中其它按鈕將被自動取消,這時就需要按鈕組(ButtonGroup)來將同組按鈕放在一起,該按鈕組中的按鈕只能選擇一個,而不在此按鈕中的按鈕不受影響。語法格式如下:
JRadioButton jr1 = new JRadioButton(); JRadioButton jr1 = new JRadioButton(); JRadioButton jr1 = new JRadioButton(); ButtonGroup group = new ButtonGroup(); group.add(jr1); group.add(jr2); group.add(jr3);
3. 復選框組件(JCheckBox)
復選框是一個方塊圖標,外加一段描述性文字,與單選按鈕的區別就是可以多選。每一個復選框都提供“選中”與“不選中”兩種狀態。語法格式如下:
JCheckBox jrb = new JCheckBox();
六、列表組件
1. 下拉列表(JComboBox)
下拉列表框使用JComboBox類對象來表示,如下方代碼:
JComboBox status = new JComboBox(); status.addItem(null); status.addItem("正在上映"); status.addItem("即將上映"); status.addItem("下架");
顯示的樣式如下:

2. 列表框(JList)
列表框只是在窗體上占據固定的大小,如果要使列表框具有滾動效果,可以將列表框放入滾動面板中。
使用數組初始化列表框的參數如下。
String[] contents = {"1", "2", "3"};
JList jl = new JList(contents);
將Vector類型的數據作為初始化JList的參數如下。
Vector contents = new Vector(); JList jl = new JList(contents); contents.add("1"); contents.add("2"); contents.add("3");
七、文本組件
1. 文本框(JTextField)
文本框用來顯示或編輯一個單行文本,語法格式如下:
JTextField jt = new JTextField("aaa"); // 創建一個文本框,值為aaa JTextField jt2 = new JTextField("aaa", 20); // 創建一個長度為20的文本框,值為aaa jt.setText(""); // 將文本框置空
其余構造方法可參考API。
2. 密碼框(JPasswordField)
密碼框與文本框的定義與用法類似,但會使用戶輸入的字符串以某種符號進行加密。如下方代碼:
JPasswordField jp = new JPasswordField(); jp.setEchoChar('#'); // 設置回顯符號
3. 文本域(JTextArea)
文本域組件在上面的代碼中已經出現了,如下方代碼所示:
JTextArea tArea = new JTextArea(20, 50); // 創建文本區域組件 tArea.setText("http://www.cnblogs.com/adamjwh/");
以上就是Swing的全部內容了,沒有太過深入的內容,在校做Java課設的話會用到這部分知識,而在外工作的很少有使用Swing的,所以就介紹個大概的知識。至於Swing的高級組件,JTabel、高級布局管理器、監聽事件等就不再介紹了,想了解的朋友可自行查閱資料。
進階篇到這里就寫完了,如果后面有時間可能會再寫個高級篇之類的,寫一些線程、JDBC等。Java都寫完了的話可能會再開一篇有關JavaWeb的內容,或者寫一些基於Java的小游戲制作。
