1. 程式人生 > >Java GUI:在Java中對於TextField的監聽

Java GUI:在Java中對於TextField的監聽

作為一個跨平臺的程式設計解決方案,Java顯然不能像Delphi那樣,在使用者介面設計方面提供強大、直觀和快捷的設計支援。比如對於文字框的控制,當我們要在程式中感知使用者是否修改了文字框中的內容時,Delphi提供了一個直接的事件呼叫OnValueChanged(),可以在文字框內容得到實際的改動時被啟用。而要在Java中實現這一功能就似乎麻煩了一點,直接的呼叫只有keyPressed()和keyTyped(),前者只對主鍵盤區(字元、數字等)有反應,對於Delete等功能鍵沒有反應,而後者又似乎反應太過靈敏,對一些不會改變文字框內容的功能鍵也積極響應。 
  那麼怎樣對Java中的文字框設定類似OnValueChanged()的事件處理呢?這首先取決於我們所使用的文字框是屬於AWT類還是Swing類。AWT(Abstract Window Toolkit:抽象視窗工具箱)最初是為了讓Java具有UI設計能力而編寫的,但在1.0版本中並不被叫好。到了Java 1.1版本之後,由於加入了新的事件驅動方法,才真正變得實用、方便和穩定起來。而Swing類則是為了應付AWT存在的不足,在Java 1.1之後推出的一個元件庫,由於是建立在Bean的基礎上(Swing的元件是Bean),所以相對AWT而言,它是一個“輕量級”的選手。Swing更“自然地”支援更多的面向物件的事件驅動,設計出的UI外觀可以在不同的平臺上和作業系統上被動態地改變。但在某些場合下,由於其嚴謹的封裝特性,具體實現過程反而顯得較AWT類要冗長一點。顯然,如果不考慮對老程式碼的繼續使用,Swing類應該是設計UI的首選。 
使用AWT類 
  對於AWT中的TextField類,實現監控的關鍵是對TextListener的使用。TextListener的宣告如下: 
  interface TextListener extends EventListener 
  它在java.awt.event包中被定義。這個介面是提供給使用者用以監聽文字內容的變化的。它所包含的方法是textValueChanged(),完整的宣告如下: 
  public void textValueChanged(TextEvent e) {} 
  當一個物件中的文字內容發生變化時,就會觸發該事件,並執行該方法中所指定的語句。要注意的是:TextListener是一個介面(interface),必須先定義一個新類來執行(implements)它。本文所定義的新類名為AWT_OnValueChanged。 
  在窗體的說明語句中,為TextField增加一個TextListener事件(本文給出的TextField物件名為textField1): 
textField1.addTextListener(new 
AWT_OnValueChanged()); 
  最後對textValueChanged()事件進行過載: 
  public void textValueChanged(TextEvent e) 
  { 
   //寫入實際程式碼,實現所需功能 
…… 
  } 
使用Swing類 
  對於Swing中的JTextField類,實現監控的過程則相對複雜一些。JTextField中沒有設定TextListener,而是將對文字的監視任務放入了另外一個介面Document中。因此首先要為JTextField物件申請一個Document介面物件,使用的方法是JTextField1.getDocument()(本文給出的JTextField物件名為JTextField1)。獲得Document後,就可以使用addDocumentListener()來得到一個和TextListener功能類似的監聽介面。DocumentListener的完整宣告如下: 
  interface DocumentListener extends EventListener 
  它在包java.swing.event.DocumentListener中定義,其中包含了三個方法: 
  ?public void changedUpdate(DocumentEvent e):監聽文字屬性的變化; 
  ?public void insertUpdate(DocumentEvent e):監聽文字內容的插入事件; 
  ?public void removeUpdate(DocumentEvent e):監聽文字內容的刪除事件。 
  和處理TextField元件一樣,定義新類(本文為Swing_OnValueChanged)、加入說明、編寫程式碼後,就可以實現所需功能了。 
程式設計實現 
  下面給出實現監控功能的關鍵部分的Java程式碼。完整程式碼編譯後在Java虛擬機器上執行,介面如圖1所示: 

  圖1 

  在兩個編輯框中或輸入或刪除或選中後修改,只要文字框中的內容得到了確切的改變,就會觸發相應的事件,從而產生輸出(在字元介面上)。 
  public class JFrame1 extends JFrame 
  { 
   public JFrame1() 
   { //生成圖形介面 
    …… 
   //對Exit按鈕的事件定義 
    btnAction exitAction = new btnAction(); 
    JButton1.addActionListener(exitAction); 
    //定義TextField元件的文字監聽 
textField1.addTextListener(new AWT_OnValue 
Changed()); 
    //定義JTextField元件的文字監聽 
  JTextField1.getDocument().addDocumentListener 
(new Swing_OnValueChanged ()); 
   } 
 //根據介面TextListener定義新AWT_OnValue 
Changed 
   class AWT_OnValueChanged implements TextListener 
   { 
    public void textValueChanged(TextEvent e) 
    { //輸出變化及結果 
     System.out.println(“Text Changed:”+textField1.getText()); 
    } 
   } 
  //根據介面DocumentListener定義新類Swing_OnValueChanged 
   class Swing_OnValueChanged implements DocumentListener 
   { //輸出變化及結果 
    public void changedUpdate(DocumentEvent e)    { 
     System.out.println(“Attribute Changed”+e); 
    } 
    public void insertUpdate(DocumentEvent e) 
    { //輸出變化及結果 
  System.out.println(“Text Inserted:”+textField1.getText()); 
    } 
    public void removeUpdate(DocumentEvent e) 
    { //輸出變化及結果 
  System.out.println(“Text Removed:”+textField1.getText()); 
    } 
   } 
   //定義新類,實現Exit按鈕的時間監聽 
   class btnAction implements ActionListener 
   { //接收事件 
    public void actionPerformed(ActionEvent event) 
    { 
     Object object = event.getSource(); 
     if (object == JButton1) 
      JButton1_actionPerformed(event); 
    } 
   } 
   //Exit按鈕事件 
void JButton1_actionPerformed(java.awt.event. 
ActionEvent event) 
   {//退出程式 
    System.exit(0); 
   } 
  } 
小 結 
  實際上,除了文字框(TextField和JTextField),只要是文字編輯區,包括TextArea、JTextArea、JTextPane等,都可以利用上述的方法來實現OnValueChanged()事件,以實現對文字區域內容的監控。 
  以上程式碼在JDK 1.2環境下編譯通過