Java進階篇(六)——Swing程序設計(下)


三、布局管理器

  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的小游戲制作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM