1. 程式人生 > >swing入門教程(二) 簡單的swing小部件

swing入門教程(二) 簡單的swing小部件

—— 就像所有的“x 入門教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應用程式如何工作有用,還對確保設定正確很有用。一旦使這個簡單的應用程式能夠成功執行,那麼之後的每個示例也將能夠執行。

JLabel

Swing 庫中最基礎的元件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他元件。下圖顯示了的 JLabel 實際應用:

JLabel

不太吸引人,但是仍然有用。實際上,在整個應用程式中,不僅把 JLabel 用作文字描述,還將它用作圖片描述。每當在 Swing 應用程式中看到圖片的時候,它就有可能是 JLabel

JLabel 對於 Swing 初學者來說沒有許多意料之外的方法。基本的方法包括設定文字、圖片、對齊以及標籤描述的其他元件:

  • 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);
}

}