Swing事件處理
什麼是事件?
一個對象的狀態變化被稱為事件,即事件描述源狀態的變化。事件產生的結果與用戶交互的圖形用戶界麵組件。例如,點擊一個按鈕,移動鼠標,通過鍵盤輸入一個字符,從列表中選擇一個項目,滾動頁麵的活動,使一個事件的發生。
事件的類型
事件可以被大致分為兩類:
-
前台事件 - 這些事件需要用戶直接互動。在圖形用戶界麵中的圖形組件交互的人產生的後果。例如,點擊一個按鈕,移動鼠標,通過鍵盤輸入一個字符,從列表中選擇一個項目,滾動頁麵等
-
後台事件 - 這些事件,需要最終用戶的交互是已知的作為背景的事件。操作係統的中斷,硬件或軟件故障,定時器到期時,操作完成的背景事件的例子。
事件處理是什麼?
事件處理機製,控製的事件,並決定如果一個事件發生時,會發生什麼。這種機製被稱為事件處理程序,在事件發生時執行的代碼。 Java使用代理事件模型來處理事件。該模型定義了標準的機製來生成和處理事件。讓我們簡要介紹這種模式。
代理事件模型具有以下的主要參與者,即:
-
源 - 源是一個對象,在該對象上的事件發生。它的處理器提供發生事件的信息來源是可靠的。 JAVA提供與源對象的類。
-
監聽器 - 它也被稱為作為事件handler.Listener是負責產生響應一個事件。從Java實現的角度來看,監聽器也是一個對象。等待直到它接收到一個事件監聽器。一旦收到事件,監聽器進程的事件就返回。
這種方法的好處是,用戶界麵邏輯完全分開,生成該事件的邏輯。用戶界麵元素是能夠委派的事件處理單獨的一段代碼。在這個模型中,需要與源對象注冊監聽使偵聽器能夠接收事件通知。這是一個有效的方式處理事件,因為這些事件通知隻發送給那些監聽器要接收他們。
參與事件處理的步驟
-
用戶單擊該按鈕時產生該事件。
-
現在有關事件類的對象是自動創建的信息源和事件在同一對象得到填充。
-
事件對象被轉發注冊監聽器類的方法。
-
該方法現在得到執行並返回。
要記住的要點有關監聽器
-
為了設計一個監聽類,我們必須開發一些監聽器接口。這些監聽器接口預測一些公共的抽象監聽器類必須實現的回調方法。
-
如果不執行任何預定義的接口,類不能作為源對象的監聽器類。
回調方法
這些方法所提供的API提供程序,被定義為應用程序員和應用程序開發者調用。這裡的回調方法代表一個事件的方法。在響應一個事件的Java JRE將觸發回調方法。所有這些回調方法的監聽器接口。
如果一個組件需要一些監聽器會聽的事件源必須注冊自己監聽。
事件處理例子
選擇使用任何編輯器創建以下java程序在 D:/ > SWING > com > yiibai > gui >
SwingControlDemo.javapackage com.yiibai.gui; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SwingControlDemo { private JFrame mainFrame; private JLabel headerLabel; private JLabel statusLabel; private JPanel controlPanel; public SwingLayoutDemo(){ prepareGUI(); } public static void main(String[] args){ SwingLayoutDemo swingLayoutDemo = new SwingLayoutDemo(); swingLayoutDemo.showEventDemo(); } private void prepareGUI(){ mainFrame = new JFrame("Java SWING Examples"); mainFrame.setSize(400,400); mainFrame.setLayout(new GridLayout(3, 1)); headerLabel = new JLabel("",JLabel.CENTER ); statusLabel = new JLabel("",JLabel.CENTER); statusLabel.setSize(350,100); mainFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowEvent){ System.exit(0); } }); controlPanel = new JPanel(); controlPanel.setLayout(new FlowLayout()); mainFrame.add(headerLabel); mainFrame.add(controlPanel); mainFrame.add(statusLabel); mainFrame.setVisible(true); } private void showEventDemo(){ headerLabel.setText("Control in action: Button"); JButton okButton = new JButton("OK"); JButton submitButton = new JButton("Submit"); JButton cancelButton = new JButton("Cancel"); okButton.setActionCommand("OK"); submitButton.setActionCommand("Submit"); cancelButton.setActionCommand("Cancel"); okButton.addActionListener(new ButtonClickListener()); submitButton.addActionListener(new ButtonClickListener()); cancelButton.addActionListener(new ButtonClickListener()); controlPanel.add(okButton); controlPanel.add(submitButton); controlPanel.add(cancelButton); mainFrame.setVisible(true); } private class ButtonClickListener implements ActionListener{ public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if( command.equals( "OK" )) { statusLabel.setText("Ok Button clicked."); } else if( command.equals( "Submit" ) ) { statusLabel.setText("Submit Button clicked."); } else { statusLabel.setText("Cancel Button clicked."); } } } }
編譯程序,使用命令提示符。到 D:/ > SWING 然後輸出以下命令。
D:AWT>javac comyiibaiguiSwingControlDemo.java
如果冇有錯誤出現,這意味著編譯成功。使用下麵的命令來運行程序。
D:AWT>java com.yiibai.gui.SwingControlDemo
驗證下麵的輸出