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


  Swing是GUI(圖形用戶界面)開發工具包,內容有很多,這里會分塊編寫,但在進階篇中只編寫Swing中的基本要素,包括容器、組件和布局等,更深入的內容這里就不介紹了。想深入學習的朋友們可查閱有關資料或圖書,比如《Java Swing圖形界面開發與案例詳解》——清華大學出版社

  早期的AWT(抽象窗口工具包)組件開發的圖形用戶界面,要依賴本地系統,當把AWT組件開發的應用程序移植到其他平台的系統上運行時,不能保證其外觀風格,因此AWT是依賴於本地系統平台的。而使用Swing開發的Java應用程序,其界面是不受本地系統平台限制的,也就是說Swing開發的Java應用程序移植到其他系統平台上時,其界面外觀是不會改變的。但要注意的是,雖然Swing提供的組件可以方便開發Java應用程序,但是Swing並不能取代AWT,在開發Swing程序時通常要借助與AWT的一些對象來共同完成應用程序的設計。

一、常用窗體

  Swing窗體是Swing的一個組件,同時也是創建圖形化用戶界面的容器,可以將其它組件放置在窗體容器中。

  1. JFrame框架窗體

  JFrame窗體是一個容器,在Swing開發中我們經常要用到,它是Swing程序中各個組件的載體。語法格式如下:

JFrame jf = new JFrame(title);

  當然,在開發中更常用的方式是通過繼承java.swing.JFrame類創建一個窗體,可通過this關鍵字調用其方法。

  而在JFrame對象創建完成后,需要調用getContentPane()方法將窗體轉換為容器,然后在容器中添加組件或設置布局管理器,通常這個容器用來包含和顯示組件。如果需要將組件添加至容器,可以使用來自Container類的add()方法進行設置。至於JPanel容器會在后面提到。

  下面舉一個JFrame窗體的例子。

 1 import javax.swing.JFrame;
 2 import javax.swing.WindowConstants;
 3 
 4 public class JFrameDemo {
 5 
 6     public void CreateJFrame() {
 7         JFrame jf = new JFrame("這是一個JFrame窗體");        // 實例化一個JFrame對象
 8         jf.setVisible(true);        // 設置窗體可視
 9         jf.setSize(500, 350);        // 設置窗體大小
10         jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        // 設置窗體關閉方式
11     }
12     
13     public static void main(String[] args) {
14         new JFrameDemo().CreateJFrame();        // 調用CreateJFrame()方法
15     }
16 
17 }

  運行結果如下:

  

  這就是一個500*350的窗體,用的是setSize()方法;標題為“這是一個JFrame窗體”,在實例化對象時就可以定義;窗體關閉方式見窗體右上角為“EXIT_ON_CLOSE”;窗體可視setVisible()方法中的參數為“false”或不寫setVisible()方法時,此窗體不可見。

  常用的窗體關閉方式有四種,分別為“DO_NOTHING_ON_CLOSE”、“DISPOSE_ON_CLOSE”、“HIDE_ON_CLOSE”、“EXIT_ON_CLOSE”。第一種表示什么也不做就將窗體關閉;第二種表示任何注冊監聽程序對象后會自動隱藏並釋放窗體;第三種表示隱藏窗口的默認窗口關閉;第四種表示退出應用程序默認窗口關閉。

  下面再舉一個用繼承JFrame的方式編寫的代碼,並加入Container容器及JLabel標簽(后面會提到),來看一下具體的流程。

 1 import java.awt.Color;
 2 import java.awt.Container;
 3 
 4 import javax.swing.JFrame;
 5 import javax.swing.JLabel;
 6 import javax.swing.SwingConstants;
 7 import javax.swing.WindowConstants;
 8 
 9 public class JFrameDemo2 extends JFrame{
10     
11     public void init() {
12         this.setVisible(true);        // 可視化
13         this.setSize(500, 350);        // 大小
14         this.setTitle("博客園");        // 標題
15         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        // 關閉方式
16         
17         JLabel jl = new JLabel("http://www.cnblogs.com/adamjwh/");        // 創建一個JLabel標簽
18         jl.setHorizontalAlignment(SwingConstants.CENTER);        // 使標簽文字居中
19         
20         Container container = this.getContentPane();        // 獲取一個容器
21         container.add(jl);        // 將標簽添加至容器
22         container.setBackground(Color.YELLOW);        // 設置容器背景顏色
23     }
24         
25     public static void main(String[] args) {
26         new JFrameDemo2().init();
27     }
28 
29 }

  運行結果如下:

  

  這里繼承了JFrame類,所以方法中實現時用this關鍵字即可(或直接實現,不加this)。12~15行為創建JFrame框體;17、18行為JLabel標簽,用與添加一個標簽;20~22行為Container容器,用getContentPane()方法為JFrame窗體獲取容器,並用add()方法將JLabel標簽添加到容器上。

  2. JDialog窗體

  JDialog窗體是Swing組件中的對話框,繼承了AWT組件中的java.awt.Dialog類。功能是從一個窗體中彈出另一個窗體。

  下面來看一個實例:

 1 import java.awt.Container;
 2 import java.awt.event.ActionEvent;
 3 import java.awt.event.ActionListener;
 4 
 5 import javax.swing.JButton;
 6 import javax.swing.JDialog;
 7 import javax.swing.JFrame;
 8 import javax.swing.JLabel;
 9 import javax.swing.WindowConstants;
10 
11 public class JDialogDemo extends JDialog {        // 繼承JDialog類
12 
13     public JDialogDemo() {
14         super(new MyJFrame(), "這是一個JDialog窗體", true); // 實例化一個JDialog類對象,指定其父窗體、窗口標題和類型
15         Container container = this.getContentPane();
16         container.add(new JLabel("http://www.cnblogs.com/adamjwh/"));
17         this.setSize(500, 350);
18     }
19     
20     
21     public static void main(String[] args) {
22         new JDialogDemo();
23     }
24 
25 }
26 
27 // 下面這部分內容包含監聽器,可自行查閱資料
28 class MyJFrame extends JFrame {
29     public MyJFrame() {
30         this.setVisible(true);
31         this.setSize(700, 500);
32         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
33         
34         Container container = this.getContentPane();
35         container.setLayout(null);
36         
37         JButton jb = new JButton("點擊彈出對話框");        // 創建按鈕
38         jb.setBounds(30, 30, 200, 50);        // 按鈕位置及大小
39         jb.addActionListener(new ActionListener() {        // 監聽器,用於監聽點擊事件
40             @Override
41             public void actionPerformed(ActionEvent e) {
42                 new JDialogDemo().setVisible(true);
43             }
44         });
45         container.add(jb);
46     }
47 }

  運行結果如下:

  

  當我們點擊按鈕時,觸發點擊事件,這時執行第42行的語句,創建一個JDialog的實例化對象,彈出一個窗口。這里出現了許多我們之前學過的知識,比如super關鍵字,在之前提到過,這里相當於使用了JDialog(Frame f, String title, boolean model)形式的構造方法;監聽器的實現就是一個匿名內部類,之前也提到過。

二、標簽組件

  在Swing中顯示文本或提示信息的方法是使用標簽,它支持文本字符串和圖標。上面我們提到的JLabel就是這里的內容。

  1. 標簽

  標簽由JLabel類定義,可以顯示一行只讀文本、一個圖像或帶圖像的文本。

  JLabel類提供了許多構造方法,可查看API選擇需要的使用,如顯示只有文本的標簽、只有圖標的標簽或包含文本與圖標的標簽等。因為上面已經出現過了,這里就不再舉例了。常用語法格式如下,創建的是一個不帶圖標和文本的JLabel對象:

JLabel jl = new JLabel();

  2. 圖標

  Swing中的圖標可以放置在按鈕、標簽等組件上,用於描述組件的用途。圖標可以用Java支持的圖片文件類型進行創建,也可以使用java.awt.Graphics類提供的功能方法來創建。

  在Swing中通過Icon接口來創建圖標,可以在創建時給定圖標的大小、顏色等特性。注意,Icon是接口,在使用Icon接口的時候,必須實現Icon接口的三個方法

public int getIconHeight()
public int getIconWidth()
public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3)

  前兩個方法用於獲取圖片的長寬,paintIcon()方法用於實現在指定坐標位置畫圖。

  下面看一個用Icon接口創建圖標的實例:

 1 import java.awt.Component;
 2 import java.awt.Container;
 3 import java.awt.Graphics;
 4 
 5 import javax.swing.Icon;
 6 import javax.swing.JFrame;
 7 import javax.swing.JLabel;
 8 import javax.swing.SwingConstants;
 9 import javax.swing.WindowConstants;
10 
11 public class IconDemo extends JFrame implements Icon {    
12 
13     private int width;        // 聲明圖標的寬
14     private int height;        // 聲明圖標的長
15     
16     public IconDemo() {}        // 定義無參構造方法
17     
18     public IconDemo(int width, int height) {        // 定義有參構造方法
19         this.width = width;
20         this.height = height;
21     }
22     
23     @Override
24     public int getIconHeight() {        // 實現getIconHeight()方法
25         return this.height;
26     }
27 
28     @Override
29     public int getIconWidth() {            // 實現getIconWidth()方法
30         return this.width;
31     }
32 
33     @Override
34     public void paintIcon(Component arg0, Graphics arg1, int arg2, int arg3) {        // 實現paintIcon()方法
35         arg1.fillOval(arg2, arg3, width, height);        // 繪制一個圓形
36     }
37 
38     public void init() {    // 定義一個方法用於實現界面
39         IconDemo iconDemo = new IconDemo(15, 15);        // 定義圖標的長和寬
40         JLabel jb = new JLabel("icon測試", iconDemo, SwingConstants.CENTER);    // 設置標簽上的文字在標簽正中間
41         
42         Container container = getContentPane();
43         container.add(jb);
44         
45         this.setVisible(true);
46         this.setSize(500, 350);
47         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
48     }
49     
50     public static void main(String[] args) {
51         new IconDemo().init();
52     }
53 
54 }

  運行結果如下:

  

  這樣如果需要在窗體中使用圖標,就可以用第39行的如下代碼創建圖標:

IconDemo iconDemo = new IconDemo(15, 15);

   3. 圖片圖標

  Swing中的圖標除了可以繪制之外,還可以使用某個特定的圖片創建。利用javax.swing.ImageIcon類根據現有圖片創建圖標。

  下面看一個實例,我們先在包下放一個圖片(注意放置位置,不同位置路徑不同),如下:

  下面是實現的代碼:

 1 import java.awt.Container;
 2 import java.net.URL;
 3 
 4 import javax.swing.Icon;
 5 import javax.swing.ImageIcon;
 6 import javax.swing.JFrame;
 7 import javax.swing.JLabel;
 8 import javax.swing.SwingConstants;
 9 import javax.swing.WindowConstants;
10 
11 public class ImageIconDemo extends JFrame {
12     
13     public ImageIconDemo() {
14         JLabel jl = new JLabel("這是一個JFrame窗體,旁邊是一個圖片");
15         URL url = ImageIconDemo.class.getResource("pencil.jpg");        // 獲得圖片所在URL
16         Icon icon = new ImageIcon(url);        // 實例化Icon對象
17         jl.setIcon(icon);        // 為標簽設置圖片
18         jl.setHorizontalAlignment(SwingConstants.CENTER);
19         jl.setOpaque(true);        // 設置標簽為不透明狀態
20         
21         Container container = getContentPane();
22         container.add(jl);
23         
24         setVisible(true);
25         setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
26         setSize(500, 350);
27     }
28     
29     public static void main(String[] args) {
30         new ImageIconDemo();
31     }
32 
33 }

   運行結果如下:

  

  對於圖片標簽,我們經常將圖片放置在標簽上,用JLabel中的setIcon()方法即可,當然也可以在初始化JLabel對象時為標簽指定圖標,這是需要獲取一個Icon實例。

  而第15行的getResource()方法可以獲得資源文件的URL路徑,這里的路徑是相對於前面的那個類的,所以可將該圖片與該類放在同一個文件夾下;如果不在同一個文件夾下,需通過其它方法獲取路徑。

 

   本篇先介紹到這里,內容比較多所以分篇編寫,下一篇為常用的布局管理器、Jpanel等內容。


免責聲明!

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



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