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 類中的成員變數來決定。
成員變數 | 含義 |
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();
}
}
執行結果為 :
如果嘗試改變窗體的大小,將會發現其中的元件大小也會發生相應的改變。