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