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等內容。