1. 程式人生 > >Java核心(Swing 程式設計2-標籤、圖示、佈局)

Java核心(Swing 程式設計2-標籤、圖示、佈局)

一、標籤元件與圖示

    在 Swing 中顯示文字或提示資訊的方法是使用標籤,它支援文字字串和圖示。在應用程式的使用者介面中,一個簡短的文字標籤可以使使用者知道這些元件的目的,所以標籤在 Swing 中是比較常用的元件。

    1.1 標籤的使用

    標籤由 JLabel 類定義,它的父類為 JComponent 類。

    標籤可以顯示一行只讀文字、一個影象或帶圖示的文字,它並不能產生任何型別的事件,只是簡單地顯示文字和圖片,但是可以使用標籤的特性指定標籤上文字的對齊方式。

    JLabel 類提供了多種構造方法,可以建立多種標籤,如顯示只有文字的標籤、只有圖示的標籤或包含文字與圖示的標籤。JLabel 類常用的及格構造方法:

    ( 1 ) :public JLabel()  :建立一個不帶圖示和文字的 JLabel 物件。

    ( 2 ) :public JLabel(Icon icon) :建立一個帶圖示的 JLabel 物件。

    ( 3 ) :public JLabel(Icon icon,int aligment) :建立一個帶圖示的 JLabel 物件,並設定圖示水平對齊方式。

    ( 4 ) :public JLabel(String text,Icon icon,int aligment) :建立一個帶文字、帶圖示的 JLabel 物件,並設定標籤內容的水平對齊方式。

    1.2 圖示的使用

    Swing 中的圖示可以放置在按鈕、標籤等元件上,用於描述元件的用途。U幣可以用 Java 支援的圖片檔案型別進行建立,也可以使用 java.awt.Graphics 類提供的功能方法來建立。

    1.2.1 建立圖示

    在 Swing 中通過 Icon 介面來建立圖示,可以在建立時給定圖示的大小、顏色等特性。如果使用 Icon 介面,必須實現 Icon 介面中的 3  個方法:

    ( 1 ) :public int getIconHeight();

    ( 2 ) :public int getIconWidth();

    ( 3 ) :public void paintIcon(Component arg(),Graphics arg1,int arg2,int arg3)。

    getIconWidth() 與 getIconHeight() 方法用於獲取圖示的寬與長,paintIcon() 方法用於實現在指定座標位置畫圖。

    eg 1.2.1 在專案中建立實現 Icon 介面的 DrawIcon 類,該類實現自定義的圖示類。

package com.SwingDemo;

import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;

import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class DrawIcon implements Icon{        //實現 Icon 介面

    private int width;        //宣告圖示的寬
    private int height;        //宣告圖示的長
	
    public DrawIcon(int width,int height) {        //定義構造方法
        this.width=width;
        this.height=height;
    }
	
    @Override
    public int getIconHeight() {
        return this.height;
    }

    @Override
    public int getIconWidth() {
        return this.width;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.fillOval(x, y, width, height);        //繪製一個圓形
    }
	
    public static void main(String[] args) {
        DrawIcon icon = new DrawIcon(15,15);
        //建立一個標籤,並設定標籤上的文字在標籤正中間
        JLabel jLabel = new JLabel("測試", icon, SwingConstants.CENTER);
        JFrame jFrame = new JFrame();        //建立一個 JFrame 視窗
        Container container = jFrame.getContentPane();
        container.add(jLabel);
        jFrame.setSize(100,100);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

    執行結果為:


    在例子中,由於 DrawIcon 類繼承了 Icon 介面,所以在該類中必須實現 Icon 介面中定義的所有方法,其中在實現 paintIcon() 方法中使用 Graphics 類中的方法繪製一個圓形的圖示,其餘實現介面的方法為返回圖示的長與寬。在 DrawIcon 類的構造方法中農設定了圖示的長與寬,這樣如果需要在窗體使用圖示,就可以使用如下程式碼建立圖示:

DrawIcon icon = new DrawIcon(15, 15);

    1.2.2  使用圖片圖示

    Swing 中的圖示除了可以繪製之外,還可以使用某個特定的圖片建立。Swing 利用 javax.swing.ImageIcon 類根據現有圖片建立圖示,ImageIcon 類實現了 Icon 介面,同時 Java 支援多種圖片格式。

    ImageIcon 類常用的構造方法如下:

    ( 1 ) :public ImageIcon() :該構造方法建立一個通用的 ImageIcon 物件,當真正想要設定圖片時在使用 ImageIcon 物件呼叫 setImage(Image image) 方法來操作。

    ( 2 ) :public ImageIcon(Image image) :可以直接從圖片源建立圖示。

    ( 3 ) :public ImageIcon(Image image,String description) :除了可以從圖片源建立圖示之外,還可以為這個圖示新增簡短的描述,但這個描述不會在圖示上顯示,可以使用 getDescripttion() 方法獲取這個描述。

    ( 4 ) :public ImageIcon(URL url) :該構造方法利用位於計算機網路上的影象檔案建立圖示。

    eg 1.2.2 在專案中建立繼承 JFrame 類的 MyImageIcon 類,在類中建立 ImageIcon 類的例項物件,該物件使用現有圖片建立圖示物件,並應用到元件上。

package com.SwingDemo;

import java.awt.Container;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class MyImageIcon extends JFrame {

    public MyImageIcon() {
        Container container = getContentPane();
        // 建立一個標籤
        JLabel jLabel = new JLabel("這是一個JFrame窗體", JLabel.CENTER);
        // 獲取圖片所在的URL
        URL url = MyImageIcon.class.getResource("imageButton.jpg");
        Icon icon = new ImageIcon(url);         // 例項化Icon物件
        jLabel.setIcon(icon);         // 為標籤設定圖片
        // 設定文字放置在標籤中間
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);
        jLabel.setOpaque(true);         // 設定標籤為不透明狀態
        container.add(jLabel);         // 將標籤新增到容器中
        setSize(250, 100);         // 設定窗體大小
        setVisible(true);         // 使窗體可見
        // 設定窗體關閉模式
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
	
    public static void main(String args[]) {
        new MyImageIcon();         // 例項化MyImageIcon物件
    }
}

    執行結果為:


二、常用佈局管理器

    在 Swing 中,每個元件在容器中都有一個具體的位置和大小,而在容器中擺放各種元件時很難判斷其具體位置和大小。佈局管理器提供了 Swing 元件安排、展示在容器中的方法及基本的佈局功能。使用佈局管理器較程式設計師直接在容器中控制 Swing 元件的位置和大小方便得多,可以有效地處理整個窗體的佈局。Swing 提供的常用佈局管理器包括流佈局管理器、邊界佈局管理器和網格佈局管理器。

    2.1 絕對佈局

    在 Swing 中,除了使用佈局管理器之外還可以使用絕對佈局。絕對佈局,就是硬性指定元件在容器中的位置和大小,可以使用絕對座標的方式來指定元件的位置。

    是用絕對佈局的步驟如下:

    ( 1 ) :使用 Container.setLayout(null)  方法取消佈局管理器。

    ( 2 ) :使用 Container.setBounds()  方法設定每個元件的大小與位置。

    eg 2.1 在專案中建立繼承 JFrame 窗體元件的 AbsolutePosition 類,設定佈局管理器為 null ,即使用絕對定位的佈局方法,建立兩個按鈕元件,將按鈕分別定位在不同的窗體位置上。

package com.SwingDemo;

import java.awt.*;
import javax.swing.*;

public class AbsolutePosition extends JFrame {
    public AbsolutePosition() {
        setTitle("本窗體使用絕對佈局");        //設定該窗體的標題
        setLayout(null);        //使該窗體取消佈局管理器設定
        setBounds(0, 0, 200, 150);        //絕對定位窗體的位置與大小
        Container container = getContentPane();        //建立容器物件
        JButton jButton1 = new JButton("按鈕1");        //建立按鈕1
        JButton jButton2 = new JButton("按鈕2");        //建立按鈕2
        jButton1.setBounds(10, 30, 80, 30);        //設定按鈕的位置與大小
        jButton2.setBounds(60, 70, 100, 20);        //設定按鈕的位置與大小
        container.add(jButton1);        //將按鈕1新增到容器中
        container.add(jButton2);        //將按鈕2新增到容器中
        setVisible(true);        //使窗體可見
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        //設定窗體關閉方式
    }
	
    public static void main(String[] args) {
        new AbsolutePosition();
    }
}

    執行結果為 :


    在例子中,窗體的大小、位置以及窗體內元件的大小與位置都被進行絕對佈局操作。絕對佈局使用 setBounds(x, y, width, height) 方法進行設定,如果使窗體物件呼叫 setBounds() 方法,它的引數 x 與 y 分別代表這個窗體在整個螢幕上出現的位置, weidth 與 height 則代表這個窗體的寬與長;如果使窗體內的元件呼叫 setBounds() 方法,引數 x 與 y 則代表這個元件在整個窗體擺放的位置,width 與 height 則代表這個窗體的大小。

    ps  :在使用絕對佈局之前需要呼叫 setLayout(null) 方法告知編譯器,這個不再使用佈局管理器。

    2.2  流佈局管理器

    流( FlowLayout )佈局管理器是最基本的佈局管理器,在整個容器中的佈局正如其名,像“ 流 ”一樣從左到右擺放元件,直到佔據了這一行的所有空間,然後再向下移動一行。預設情況下,元件在每一行都是居中排列的,但是通過設定也可以更改元件在每一行上的排列位置。

    FlowLayout  類中具有以下常用的構造方法 :

    ( 1 ) :public FlowLayout() 。

    ( 2 ) :public FlowLayout(int alignment) 。

    ( 3 ) :public FlowLayout(int alignment , int horizGap , int vertGap) 。

    構造方法的 alignment 引數表示使用流佈局管理器後元件在一行的具體擺放位置。它可以被賦予以下 3 個值之一 :

    ( 1 ) :FlowLayout.LEFT = 0 。

    ( 2 ) :FlowLayout.CENTER = 1 。

    ( 3 ) :FlowLayout.RIGHT = 2 。

    上述 3 個值分別代表容器使用流佈局管理器後元件在每一行中的擺放位置。例如 :將 alignment 設定為 0 時,每一行的元件將被指定按照左對齊排列;而將 alignment 設定為 2 時,每一行的元件將被指定為按照右對齊排列。

    在 public FlowLayout(int alignment , int horizGap , int vertGap)  構造方法中還存在 horizGap  與 vertGap 兩個引數,這兩個引數分別以畫素為單位指定元件之間的水平間隔與垂直間隔。

    eg 2.2  在專案中建立 FlowLayoutPosition 類,該類繼承 JFrame 類稱為窗體元件。設定該窗體的佈局管理器為 FlowLayout 佈局管理器的例項物件。

package com.SwingDemo;

import java.awt.*;
import javax.swing.*;

public class FlowLayoutPosition extends JFrame {
    public FlowLayoutPosition() {
        setTitle("本窗體使用流佈局管理器");        // 設定窗體標題
        Container container = getContentPane();        // 建立容器物件
        // 設定窗體使用流佈局管理器,使元件右對齊,並且設定元件之間的水平間隔與垂直間隔
        setLayout(new FlowLayout(2, 10, 10));
        for (int i = 0; i < 10; i++) {        // 在容器中迴圈新增 10 個按鈕
            container.add(new JButton("button" + i));
        }
        setSize(300, 200);
        setVisible(true);        // 使窗體可見
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        // 設定窗體關閉方式
    }

    public static void main(String[] args) {
        new FlowLayoutPosition();
    }
}

    執行結果為 :

 

    如果改變整個窗體的大小,其中元件的擺放位置也會相應地發生變化,這正好驗證了使用流佈局管理器時元件從左到右擺放,當元件填滿一行後,將自動換行,直到所有元件都擺放在容器中為止。

    2.3 邊界佈局管理器

    在預設不指定窗體佈局的情況下,Swing 元件的佈局模式是邊界(BorderLayout)佈局管理器。

    邊界佈局管理器可以將容器劃分為東、南、西、北、中 5 個區域,可以將元件加入到這 5 個區域中。容器呼叫 Container 類的 Add()  方法新增元件時可以設定此元件在邊界佈局管理器中的區域,區域的控制可以由BorderLayout 類中的成員變數來決定。

表 2.3 BorderLayout 類的主要成員變數
成員變數含義
BorderLayout.NORTH在容器中新增元件時,元件置於頂端
BorderLayout.SOUTH在容器中新增元件時,元件置於底端
BorderLayout.EAST在容器中新增元件時,元件置於右端
BorderLayout.WEST在容器中新增元件時,元件置於左端
BorderLayout.CENTER在容器中新增元件時,元件置於中間開始填充,直到與其他元件邊界連線

    eg 2.3 在專案中建立 BorderLayoutPosition 類,該類繼承 JFrame 類成為窗體元件,設定該窗體的佈局管理器使用 BorederLayout 類的例項物件。

package com.SwingDemo;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class BorderLayoutPositon 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" };
    public BorderLayoutPositon() {
        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.DISPOSE_ON_CLOSE);        // 設定窗體關閉方式
    }

    public static void main(String[] args) {
        new BorderLayoutPositon();
    }
}

    執行結果為 :


    在本例中,將佈局以及元件名稱分別放置在陣列中,然後設定容器使用邊界佈局管理器,最後在迴圈中將按鈕新增至容器中,並設定元件佈局。add() 方法提供在容器中新增元件的功能,並同時設定元件的擺放位置。

    2.4  網格佈局管理器

    網格(GridLayout)佈局管理器將容器劃分為網格,所以元件可以按行和列進行排列。在網格佈局管理器中,每一個元件的大小都相同,並且網格中空格的個數由網格的行數和列數決定,如一個兩行兩列的網格能產生 4 個大小相等的網格。元件從網格的左上角開始,按照從左到右。從上到下的順序加入到網格中,而且每一個元件都會填滿整個網格,改變窗體的大小,元件的大小也會隨之改變。

    網格佈局管理器主要以下兩個常用的構造方法。

    ( 1 ) : public GridLayout(int rows , int columns) 。

    ( 2 ) :public GridLayout(int rows , int columns , int horizGap , int vertGap)

    rows 與 columns 引數代表網格的行數與列數,這兩個引數只有一個引數可以為 0 ,代表一行或一列可以排列任意多個元件;引數 horizGap 與 vertGap 指定網格之間的間距,其中 horizGap 引數指定網格之間的水平間距,vertGap 引數指定網格之間的垂直間距。

    eg 2.4 在專案中建立 GridLayoutPosition 類,該類繼承 JFrame 類稱為窗體元件,設定該窗體使用  GridLayout 佈局管理器。 

package com.SwingDemo;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class GridLayoutPositon extends JFrame {
    public GridLayoutPositon() {
        Container container = getContentPane();
        // 設定容器中使用網格佈局管理器,設定 7 行 3 列的網格
        setLayout(new GridLayout(7, 3, 5, 5));
        for (int i = 0; i < 20; i++) {
            container.add(new JButton("button" + i));        // 迴圈新增按鈕
        }
        setTitle("這是一個使用網格佈局管理器的窗體");
        setSize(300, 300);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new GridLayoutPositon();
    }
}

執行結果為 :

  

    如果嘗試改變窗體的大小,將會發現其中的元件大小也會發生相應的改變。