更新時間:2021-06-22 來源:黑馬程序員 瀏覽量:
Swing組件中的事件處理專門用于響應(yīng)用戶的操作,例如,響應(yīng)用戶的單擊鼠標、按下鍵盤等操作。在Swing事件處理的過程中,主要涉及到三類對象:
● 事件源(Event Source):事件發(fā)生的場所,通常就是產(chǎn)生事件的組件,例如窗口、按鈕、菜單等。
● 事件對象(Event):封裝了GUI組件上發(fā)生的特定事件(通常就是用戶的一次操作)。
● 監(jiān)聽器(Listener):負責監(jiān)聽事件源上發(fā)生的事件,并對各種事件做出相應(yīng)處理的對象(對象中包含事件處理器)。
上面提到的事件源、事件對象、監(jiān)聽器在整個事件處理過程中都起著非常重要的作用,它們彼此之間有著非常緊密的聯(lián)系。接下來用一個圖例來描述事件處理的工作流程,如圖1所示。
圖1 事件處理流程圖
在圖1中,事件源是一個組件,當用戶進行一些操作時,如按下鼠標或者釋放鍵盤等,都會觸發(fā)相應(yīng)的事件,如果事件源注冊了監(jiān)聽器,則觸發(fā)的相應(yīng)事件將會被處理。
接下來,通過一個案例來演示Swing中的事件處理,如文件1所示。
文件1 Example06.java
import java.awt.event.*; import javax.swing.*; // 自定義事件監(jiān)聽器類 class MyListener implements ActionListener{ // 實現(xiàn)監(jiān)聽器方法,對監(jiān)聽事件進行處理 public void actionPerformed(ActionEvent e) { System.out.println("用戶點擊了JButton按鈕組件"); } } public class Example06 { private static void createAndShowGUI() { JFrame f = new JFrame("JFrame窗口"); f.setSize(200, 100); // 創(chuàng)建一個按鈕組件,作為事件源 JButton btn = new JButton("按鈕"); // 為按鈕組件事件源添加自定義監(jiān)聽器 btn.addActionListener(new MyListener()); f.add(btn); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { // 使用SwingUtilities工具類調(diào)用createAndShowGUI()方法并顯示GUI程序 SwingUtilities.invokeLater(Example06::createAndShowGUI); } }
運行結(jié)果如圖2所示。
圖2 運行結(jié)果
單擊圖2中的按鈕組件,查看控制臺,顯示輸出結(jié)果如圖3所示。
圖3 運行結(jié)果
文件1中,在JFrame窗口中添加了一個JButton按鈕組件,同時通過addActionListener()方法為按鈕組件添加了一個自定義事件監(jiān)聽器,當單擊按鈕組件時就會觸發(fā)事件監(jiān)聽器,進行事件處理。
從上面的程序可以看出,實現(xiàn)Swing事件處理的主要步驟如下:
(1)創(chuàng)建事件源:除了一些常見的按鈕、鍵盤等組件可以作為事件源外,包括JFrame窗口在內(nèi)的頂級容器也可以作為事件源;
(2)自定義事件監(jiān)聽器:根據(jù)要監(jiān)聽的事件源創(chuàng)建指定類型的監(jiān)聽器進行事件處理,該監(jiān)聽器是一個特殊的Java類,必須實現(xiàn)XxxListener接口(根據(jù)組件觸發(fā)的動作進行區(qū)分,如WindowListener用于監(jiān)聽窗口事件,ActionListener用于監(jiān)聽動作事件);
(3)為事件源注冊監(jiān)聽器:使用addXxxListener()方法為指定事件源添加特定類型的監(jiān)聽器。當事件源上發(fā)生監(jiān)聽的事件后,就會觸發(fā)綁定的事件監(jiān)聽器,然后由監(jiān)聽器中的方法進行相應(yīng)處理。