一個(gè)對(duì)象的狀態(tài)變化被稱為事件,即事件描述源狀態(tài)的變化。事件產(chǎn)生的結(jié)果與用戶交互的圖形用戶界面組件。例如,點(diǎn)擊一個(gè)按鈕,移動(dòng)鼠標(biāo),通過(guò)鍵盤(pán)輸入一個(gè)字符,從列表中選擇一個(gè)項(xiàng)目,滾動(dòng)頁(yè)面的活動(dòng),使一個(gè)事件的發(fā)生。
事件可以被大致分為兩類:
前臺(tái)事件 - 這些事件需要用戶直接互動(dòng)。在圖形用戶界面中的圖形組件交互的人產(chǎn)生的后果。例如,點(diǎn)擊一個(gè)按鈕,移動(dòng)鼠標(biāo),通過(guò)鍵盤(pán)輸入一個(gè)字符,從列表中選擇一個(gè)項(xiàng)目,滾動(dòng)頁(yè)面等
后臺(tái)事件 - 這些事件,需要最終用戶的交互是已知的作為背景的事件。操作系統(tǒng)的中斷,硬件或軟件故障,定時(shí)器到期時(shí),操作完成的背景事件的例子。
事件處理機(jī)制,控制的事件,并決定如果一個(gè)事件發(fā)生時(shí),會(huì)發(fā)生什么。這種機(jī)制被稱為事件處理程序,在事件發(fā)生時(shí)執(zhí)行的代碼。 Java使用代理事件模型來(lái)處理事件。該模型定義了標(biāo)準(zhǔn)的機(jī)制來(lái)生成和處理事件。讓我們簡(jiǎn)要介紹這種模式。
代理事件模型具有以下的主要參與者,即:
源 - 源是一個(gè)對(duì)象,在該對(duì)象上的事件發(fā)生。它的處理器提供發(fā)生事件的信息來(lái)源是可靠的。 JAVA提供與源對(duì)象的類。
監(jiān)聽(tīng)器 - 它也被稱為作為事件handler.Listener是負(fù)責(zé)產(chǎn)生響應(yīng)一個(gè)事件。從Java實(shí)現(xiàn)的角度來(lái)看,監(jiān)聽(tīng)器也是一個(gè)對(duì)象。等待直到它接收到一個(gè)事件監(jiān)聽(tīng)器。一旦收到事件,監(jiān)聽(tīng)器進(jìn)程的事件就返回。
這種方法的好處是,用戶界面邏輯完全分開(kāi),生成該事件的邏輯。用戶界面元素是能夠委派的事件處理單獨(dú)的一段代碼。在這個(gè)模型中,需要與源對(duì)象注冊(cè)監(jiān)聽(tīng)使偵聽(tīng)器能夠接收事件通知。這是一個(gè)有效的方式處理事件,因?yàn)檫@些事件通知只發(fā)送給那些監(jiān)聽(tīng)器要接收他們。
用戶單擊該按鈕時(shí)產(chǎn)生該事件。
現(xiàn)在有關(guān)事件類的對(duì)象是自動(dòng)創(chuàng)建的信息源和事件在同一對(duì)象得到填充。
事件對(duì)象被轉(zhuǎn)發(fā)注冊(cè)監(jiān)聽(tīng)器類的方法。
該方法現(xiàn)在得到執(zhí)行并返回。
為了設(shè)計(jì)一個(gè)監(jiān)聽(tīng)類,我們必須開(kāi)發(fā)一些監(jiān)聽(tīng)器接口。這些監(jiān)聽(tīng)器接口預(yù)測(cè)一些公共的抽象監(jiān)聽(tīng)器類必須實(shí)現(xiàn)的回調(diào)方法。
如果不執(zhí)行任何預(yù)定義的接口,類不能作為源對(duì)象的監(jiān)聽(tīng)器類。
這些方法所提供的API提供程序,被定義為應(yīng)用程序員和應(yīng)用程序開(kāi)發(fā)者調(diào)用。這里的回調(diào)方法代表一個(gè)事件的方法。在響應(yīng)一個(gè)事件的Java JRE將觸發(fā)回調(diào)方法。所有這些回調(diào)方法的監(jiān)聽(tīng)器接口。
如果一個(gè)組件需要一些監(jiān)聽(tīng)器會(huì)聽(tīng)的事件源必須注冊(cè)自己監(jiān)聽(tīng)。
選擇使用任何編輯器創(chuàng)建以下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上一篇:Swing FocusAdapter類下一篇:Swing JMenuBar類