swing入門教程(二) 簡單的swing小部件
—— 就像所有的“x 入門”教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應用程式如何工作有用,還對確保設定正確很有用。一旦使這個簡單的應用程式能夠成功執行,那麼之後的每個示例也將能夠執行。
JLabel
Swing 庫中最基礎的元件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他元件。下圖顯示了的 JLabel 實際應用:
JLabel
不太吸引人,但是仍然有用。實際上,在整個應用程式中,不僅把 JLabel 用作文字描述,還將它用作圖片描述。每當在 Swing 應用程式中看到圖片的時候,它就有可能是 JLabel
- get/setText(): 獲取/設定標籤的文字。
- get/seticon(): 獲取/設定標籤的圖片。
- get/setHorizontalAlignment(): 獲取/設定文字的水平位置。
- get/setVerticalAlignment(): 獲取/設定文字的垂直位置。
- get/setDisplayedMnemonic(): 獲取/設定標籤的訪問鍵(下劃線文字)。
- get/setLableFor(): 獲取/設定這個標籤附著的元件,所以當用戶按下 Alt+訪問鍵時,焦點轉移到指定的元件。
JButton
Swing 中的基本動作元件 JButton,是與每個視窗中都能看到的 OK 和 Cancel 一樣的按鈕;這些按鈕所做的正是您希望它們做的工作 —— 在單擊它們之後,將發生一些事情。到底會發生什麼呢?您必須定義發生的內容(請參閱 事件,以獲得更多資訊)。一個 JButton 例項看起來如下所示:
JButton
用來改變 JButton 屬性的方法與 JLabel 的方法類似(您可能發現,在大多數 Swing 元件中,這些屬性都類似)。它們控制文字、圖片和方向:
- get/setText(): 獲取/設定標籤的文字。
- get/seticon(): 獲取/設定標籤的圖片。
- get/setHorizontalAlignment():
- get/setVerticalAlignment(): 獲取/設定文字的垂直位置。
- get/setDisplayedMnemonic(): 獲取/設定訪問鍵(下劃線字元),與 Alt 按鈕組合時,造成按鈕單擊。
除了這些方法,我還要介紹 JButton 包含的另外一組方法。這些方法利用了按鈕的所有不同狀態。狀態是對元件進行描述的一個屬性,通常採用真/假設定。在 JButton 中,可以包含以下可能狀態:活動/不活動、選中/沒選中、滑鼠經過/滑鼠離開、按下/沒按下,等等。另外,可以組合這些狀態,例如按鈕可以在滑鼠經過的同時被選中。現在您可能會問自己用這些狀態到底要做什麼。作為示例,請看看您的瀏覽器上的後退按鈕。請注意在滑鼠經過它的時候,圖片是如何變化的,在按下該按鈕時,圖片又是如何變化的。這個按鈕利用了不同的狀態。每個狀態採用不同的圖片,這是提示使用者互動正在進行的一種普遍並且有效的方式。JButton 上的狀態方法是:
- get/setDisabledIcon()
- get/setDisableSelectedIcon()
- get/setIcon()
- get/setPressedIcon()
- get/setRolloverIcon()
- get/setRolloverSelectedIcon()
- get/setSelectedIcon()
JTextField
Swing 中的基本文字元件是 JTextField,它允許使用者在 UI 中輸入文字。我肯定您熟悉文字欄位:要掌握本教程,則必須使用一個文字欄位輸入使用者名稱和口令。您輸入文字、刪除文字、選中文字、把文字四處移動 —— Swing 替您負責所有這些工作。作為 UI 開發人員,利用 JJTextField 時,實際上並不需要做什麼。
在任何情況下,這是 JTextField 實際使用時看起來的樣子:
JTextField
在處理 JTextField
時,只需要關注一個方法 ——
這應當是很明顯的,這個方法就是設定文字的方法:get/setText()
,用於獲取/設定
JTextField 中的文字。
JFrame
迄今為止,我介紹了 Swing 的三個基本構造塊:標籤、按鈕和文字欄位;但是現在需要個地方放它們,希望使用者知道如何處理它們。JFrame類就是做這個的——它是一個容器,允許您把其他元件新增到它裡面,把它們組織起來,並把它們呈現給使用者。它有許多其他好處,但是我認為先看看它的圖片最簡單:
JFrame
JFrame 實際上不僅僅讓您把元件放入其中並呈現給使用者。比起它表面上的簡單性,它實際上是 Swing 包中最複雜的元件。為了最大程度地簡化元件,在獨立於作業系統的 Swing 元件與實際執行這些元件的作業系統之間,JFrame 起著橋樑的作用。JFrame 在本機作業系統中是以視窗的形式註冊的,這麼做之後,就可以得到許多熟悉的作業系統視窗的特性:最小化/最大化、改變大小、移動。但是對於本教程的目標來說,把 JFrame 當作放置元件的調色盤就足夠了。可以在 JFrame 上呼叫的一些修改屬性的方法是:
- get/setTitle(): 獲取/設定幀的標題。
- get/setState(): 獲取/設定幀的最小化、最大化等狀態。
- is/setVisible(): 獲取/設定幀的可視狀態,換句話說,是否在螢幕上顯示。
- get/setLocation(): 獲取/設定幀在螢幕上應當出現的位置。
- get/setsize(): 獲取/設定幀的大小。
- add(): 將元件新增到幀中。
簡單應用程式
就像所有的“x 入門”教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應用程式如何工作有用,還對確保設定正確很有用。一旦使這個簡單的應用程式能夠成功執行,那麼之後的每個示例也將能夠執行。下圖顯示了完成後的示例:
HelloWorld 示例
第一步是建立類。將元件放在 JFrame 上的 Swing 應用程式需要繼承JFrame 類,如下所示:
public class HelloWorld extends JFrame
這樣做之後,就得到上面描述的所有 JFrame 屬性,最重要的是作業系統對視窗的本機支援。下一步是把元件放在螢幕上。在這個示例中,使用了一個 null 佈局。在教程的後面部分,您將學到更多關於佈局和佈局管理器的內容。但對於這個示例,可以用數字表示 JFrame 上的畫素位置:
public HelloWorld()
{
super();
this.setSize(300, 200);
this.getContentPane().setLayout(null);
this.add(getJLabel(), null);
this.add(getJTextField(), null);
this.add(getJButton(), null);
this.setTitle("HelloWorld");
}
private javax.swing.JLabel getJLabel() {
if(jLabel == null) {
jLabel = new javax.swing.JLabel();
jLabel.setBounds(34, 49, 53, 18);
jLabel.setText("Name:");
}
return jLabel;
}
private javax.swing.JTextField getJTextField() {
if(jTextField == null) {
jTextField = new javax.swing.JTextField();
jTextField.setBounds(96, 49, 160, 20);
}
return jTextField;
}
private javax.swing.JButton getJButton() {
if(jButton == null) {
jButton = new javax.swing.JButton();
jButton.setBounds(103, 110, 71, 27);
jButton.setText("OK");
}
return jButton;
}
現在元件都放在了 JFrame 上,並且需要在螢幕上顯示 JFrame,並讓應用程式可以執行。就像在所有的 Java 應用程式中一樣,必須新增一個 main 方法,才能讓 Swing 應用程式執行。在這個 main 方法中,只需要建立 HelloWorld 應用程式物件,然後呼叫其setVisible()即可:
public static void main(String[] args)
{
HelloWorld w = new HelloWorld();
w.setVisible(true);
}
完成了!這就是建立應用程式的所有過程。
完整程式碼如下:
package cn.edu.jnu.www;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class HelloWorld extends JFrame{
private JLabel jLabel;
private JTextField jTextField;
private JButton jButton;
public HelloWorld()
{
super();
this.setSize(300, 200);
this.getContentPane().setLayout(null);
this.add(getJLabel(), null);
this.add(getJTextField(), null);
this.add(getJButton(), null);
this.setTitle("HelloWorld");
}
private javax.swing.JLabel getJLabel() {
if(jLabel == null) {
jLabel = new javax.swing.JLabel();
jLabel.setBounds(34, 49, 53, 18);
jLabel.setText("Name:");
}
return jLabel;
}
private javax.swing.JTextField getJTextField() {
if(jTextField == null) {
jTextField = new javax.swing.JTextField();
jTextField.setBounds(96, 49, 160, 20);
}
return jTextField;
}
private javax.swing.JButton getJButton() {
if(jButton == null) {
jButton = new javax.swing.JButton();
jButton.setBounds(103, 110, 71, 27);
jButton.setText("OK");
}
return jButton;
}
public static void main(String[] args)
{
HelloWorld w = new HelloWorld();
w.setVisible(true);
}
}