Java GUI:在Java中對於TextField的監聽
阿新 • • 發佈:2019-02-04
作為一個跨平臺的程式設計解決方案,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環境下編譯通過
那麼怎樣對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環境下編譯通過