更新時(shí)間:2021-04-29 來源:黑馬程序員 瀏覽量:
在Swing中,提供了豐富的事件,這些事件大致可以分為窗體事件(WindowEvent)、鼠標(biāo)事件(MouseEvent)、鍵盤事件(KeyEvent)、動(dòng)作事件(ActionEvent)等。接下來,本節(jié)中將對(duì)這些常用事件進(jìn)行詳細(xì)地講解。
1.窗體事件
大部分GUI應(yīng)用程序都需要使用Window窗體對(duì)象作為最外層的容器,可以說窗體對(duì)象是所有GUI應(yīng)用程序的基礎(chǔ),應(yīng)用程序中通常都是將其他組件直接或者間接地添加到窗體中。
當(dāng)對(duì)窗體進(jìn)行操作時(shí),例如窗體的打開、關(guān)閉、激活、停用等,這些動(dòng)作都屬于窗體事件,Java中提供了一個(gè)WindowEvent類用于表示窗體事件。在應(yīng)用程序中,當(dāng)對(duì)窗體事件進(jìn)行處理時(shí),首先需要定義一個(gè)實(shí)現(xiàn)了WindowListener接口的類作為窗體監(jiān)聽器,然后通過addWindowListener()方法將窗體對(duì)象與窗體監(jiān)聽器進(jìn)行綁定。
接下來通過一個(gè)案例來實(shí)現(xiàn)對(duì)窗體事件的監(jiān)聽,如文件1所示。
文件1 Example07.java
import java.awt.event.*; import javax.swing.*; public class Example07 { private static void createAndShowGUI() { JFrame f = new JFrame("WindowEvent"); f.setSize(400, 300); f.setLocation(300, 200); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 使用內(nèi)部類創(chuàng)建WindowListener實(shí)例對(duì)象,監(jiān)聽窗體事件 f.addWindowListener(new WindowListener() { public void windowOpened(WindowEvent e) { System.out.println("windowOpened---窗體打開事件"); } public void windowIconified(WindowEvent e) { System.out.println("windowIconified---窗體圖標(biāo)化事件"); } public void windowDeiconified(WindowEvent e) { System.out.println("windowDeiconified---窗體取消圖標(biāo)化事件"); } public void windowDeactivated(WindowEvent e) { System.out.println("windowDeactivated---窗體停用事件"); } public void windowClosing(WindowEvent e) { System.out.println("windowClosing---窗體正在關(guān)閉事件"); } public void windowClosed(WindowEvent e) { System.out.println("windowClosed---窗體關(guān)閉事件"); } public void windowActivated(WindowEvent e) { System.out.println("windowActivated---窗體激活事件"); } }); } public static void main(String[] args) { // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序 SwingUtilities.invokeLater(Example07::createAndShowGUI); } }運(yùn)行結(jié)果如圖1所示。
圖1 運(yùn)行結(jié)果
文件1中,通過WindowListener對(duì)操作窗口的窗體事件進(jìn)行監(jiān)聽,當(dāng)接收到特定的動(dòng)作后,就將所觸發(fā)事件的名稱打印出來。接著對(duì)圖8-11所示的窗體事件源進(jìn)行事件操作,分別執(zhí)行最小化、單擊任務(wù)欄圖標(biāo)、單擊關(guān)閉按鈕時(shí),窗口事件監(jiān)聽器就會(huì)對(duì)相應(yīng)的操作進(jìn)行監(jiān)聽并響應(yīng),結(jié)果如圖2所示。
圖2 運(yùn)行結(jié)果
2.鼠標(biāo)事件
在圖形用戶界面中,用戶會(huì)經(jīng)常使用鼠標(biāo)來進(jìn)行選擇、切換界面等操作,這些操作被定義為鼠標(biāo)事件,其中包括鼠標(biāo)按下、鼠標(biāo)松開、鼠標(biāo)單擊等。Java中提供了一個(gè)MouseEvent類用于表示鼠標(biāo)事件,幾乎所有的組件都可以產(chǎn)生鼠標(biāo)事件。處理鼠標(biāo)事件時(shí),首先需要通過實(shí)現(xiàn)MouseListener接口定義監(jiān)聽器(也可以通過繼承適配器MouseAdapter類來實(shí)現(xiàn)),然后調(diào)用addMouseListener()方法將監(jiān)聽器綁定到事件源對(duì)象。
接下來通過一個(gè)案例來學(xué)習(xí)如何監(jiān)聽鼠標(biāo)事件,如文件2所示。
文件2 Example08.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Example08 { private static void createAndShowGUI() { JFrame f = new JFrame("MouseEvent"); f.setLayout(new FlowLayout()); // 為窗口設(shè)置布局 f.setSize(300, 200); f.setLocation(300, 200); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton but = new JButton("Button");// 創(chuàng)建按鈕對(duì)象 f.add(but); // 在窗口添加按鈕組件 // 為按鈕添加鼠標(biāo)事件監(jiān)聽器 but.addMouseListener(new MouseListener() { public void mouseReleased(MouseEvent e) { System.out.println("mouseReleased-鼠標(biāo)放開事件"); } public void mousePressed(MouseEvent e) { System.out.println("mousePressed-鼠標(biāo)按下事件"); } public void mouseExited(MouseEvent e) { System.out.println("mouseExited—鼠標(biāo)移出按鈕區(qū)域事件"); } public void mouseEntered(MouseEvent e) { System.out.println("mouseEntered—鼠標(biāo)進(jìn)入按鈕區(qū)域事件"); } public void mouseClicked(MouseEvent e) { System.out.println("mouseClicked-鼠標(biāo)完成單擊事件"); } }); } public static void main(String[] args) { // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序 SwingUtilities.invokeLater(Example08::createAndShowGUI); } }
運(yùn)行結(jié)果如圖3所示。
圖3 運(yùn)行結(jié)果
在圖3中,用鼠標(biāo)對(duì)窗口上的按鈕進(jìn)行操作,先把鼠標(biāo)移進(jìn)按鈕區(qū)域,接著單擊按鈕然后釋放,再移出按鈕區(qū)域,控制臺(tái)的輸出信息如圖4所示。
圖4 運(yùn)行結(jié)果
從圖4可以看出,當(dāng)鼠標(biāo)對(duì)按鈕作出了相應(yīng)的動(dòng)作之后,監(jiān)聽器獲取到相應(yīng)的事件對(duì)象,從而打印出動(dòng)作所對(duì)應(yīng)的事件名稱。
讀者可能會(huì)問,鼠標(biāo)的操作分為左鍵單雙擊和右鍵單雙擊,而且還有滾輪動(dòng)作。上面只給出這些事件的處理,能滿足實(shí)際需求嗎?答案是肯定的,MouseEvent類中定義了很多常量來識(shí)別鼠標(biāo)動(dòng)作。如下面的代碼所示:
public void mouseClicked(MouseEvent e) { if(e.getButton()==MouseEvent.BUTTON1){ System.out.println("鼠標(biāo)左擊事件"); } if(e.getButton()==MouseEvent.BUTTON3){ System.out.println("鼠標(biāo)右擊事件"); } if(e.getButton()==MouseEvent.BUTTON2){ System.out.println("鼠標(biāo)中鍵單擊事件"); } }
從上面的代碼可以看出,MouseEvent類中針對(duì)鼠標(biāo)的按鍵都定義了對(duì)應(yīng)的常量,可以通過MouseEvent對(duì)象的getButton()方法獲取被操作按鍵的鍵值,從而判斷是哪個(gè)按鍵的操作。另外,鼠標(biāo)的單擊次數(shù)也可以通過MouseEvent對(duì)象的getClickCount()方法獲取到。因此,在鼠標(biāo)事件中,可以根據(jù)不同的操作,做出相應(yīng)的處理。
3.鍵盤事件
鍵盤操作也是最常用的用戶交互方式,例如鍵盤按下、釋放等,這些操作被定義為鍵盤事件。Java中提供了一個(gè)KeyEvent類表示鍵盤事件,處理KeyEvent事件的監(jiān)聽器對(duì)象需要實(shí)現(xiàn)KeyListener接口或者繼承KeyAdapter類,然后調(diào)用addKeyListener()方法將監(jiān)聽器綁定到事件源對(duì)象。
接下來通過一個(gè)案例來學(xué)習(xí)如何監(jiān)聽鍵盤事件,如文件3所示。
文件3 Example09.java
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Example09 { private static void createAndShowGUI() { JFrame f = new JFrame("KeyEvent"); f.setLayout(new FlowLayout()); f.setSize(400, 300); f.setLocation(300, 200); JTextField tf = new JTextField(30); // 創(chuàng)建文本框?qū)ο? f.add(tf); // 在窗口中添加文本框組件 f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 為文本框添加鍵盤事件監(jiān)聽器 tf.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { // 獲取對(duì)應(yīng)的鍵盤字符 char keyChar = e.getKeyChar(); // 獲取對(duì)應(yīng)的鍵盤字符代碼 int keyCode = e.getKeyCode(); System.out.print("鍵盤按下的字符內(nèi)容為:" + keyChar+" "); System.out.println("鍵盤按下的字符代碼為:" + keyCode); } }); } public static void main(String[] args) { // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序 SwingUtilities.invokeLater(Example09::createAndShowGUI); } }
運(yùn)行結(jié)果如圖5所示。
圖5 運(yùn)行結(jié)果
文件3中,用到JTextComponent類的子類JTextField,它只允許編輯單行文本。當(dāng)在圖8-15中的文件框中鍵入字符時(shí),便觸發(fā)了鍵盤事件,會(huì)執(zhí)行重寫的keyPressed()方法。這時(shí),可以通過KeyEvent類的getKeyChar()方法獲取鍵盤鍵入的字符,通過getKeyCode()方法可以獲取輸入字符對(duì)應(yīng)的整數(shù)值。在圖5所示的窗口中,依次輸入鍵盤上的a、s、1字符時(shí),控制臺(tái)將按鍵對(duì)應(yīng)的名稱和鍵值(keyCode)打印了出來,如圖6所示。
圖6 運(yùn)行結(jié)果
4.動(dòng)作事件
動(dòng)作事件與前面三種事件有所不同,它不代表某類事件,只是表示一個(gè)動(dòng)作發(fā)生了。例如,在關(guān)閉一個(gè)文件時(shí),可以通過鍵盤關(guān)閉,也可以通過鼠標(biāo)關(guān)閉。在這里讀者不需要關(guān)心使用哪種方式對(duì)文件進(jìn)行關(guān)閉,只要是對(duì)關(guān)閉按鈕進(jìn)行操作,即觸發(fā)了動(dòng)作事件。
在Java中,動(dòng)作事件用ActionEvent類表示,處理ActionEvent事件的監(jiān)聽器對(duì)象需要實(shí)現(xiàn)ActionListener接口。監(jiān)聽器對(duì)象在監(jiān)聽動(dòng)作時(shí),不會(huì)像鼠標(biāo)事件一樣處理鼠標(biāo)的移動(dòng)和單擊的細(xì)節(jié),而是去處理類似于“按鈕按下”這樣“有意義”的事件。