java中的AWT事件處理問題
事件處理的過程中,主要涉及3類對象
Event Source
(事件源):事件發(fā)生的聲所,如按鈕,窗口,菜單等組件。Event
(事件):事件封裝了GUI組件上發(fā)生的特定事情(通常是一次用打操作)。Event Listener
(事件監(jiān)聽器):負責監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出響應(yīng)處理。
實現(xiàn)AWT事件處理機制的步驟如下
1.實現(xiàn)事件監(jiān)聽器類,該監(jiān)聽器類是一個特殊的java類,必須實現(xiàn)一個XxxListener接口。
2.創(chuàng)建普通組件(事件源),創(chuàng)建事件監(jiān)聽器對象。
3.調(diào)用addXxxListener()方法將事件監(jiān)聽器對象注冊給普通組件(事件源)。當事件源上發(fā)生指定事件時,AWT會觸發(fā)事件監(jiān)聽器,由事件監(jiān)聽器調(diào)用相應(yīng)的方法(事件處理器)來處理事件,事件源上所發(fā)生的事件會作為參數(shù)傳入事件處理器。
AWT的事件類都是AWTEvent類的子類,AWTEvent是EventObject的子類。
AWT事件分為兩在類:低級事件和高組事件
1.低級事件
低級事件是指基于特定動作的事件.比如進入,點擊,拖入等動作的鼠標事件,當組件得到焦點失去焦點時觸發(fā)的事件.
ComponentEvent
:組件事件,當組件尺寸發(fā)生變化,位置發(fā)生移動,顯示/隱藏狀態(tài)發(fā)生改變時觸發(fā)該事件.ContainerEvent
:容器事件,當容器里發(fā)生添加級件,刪除組件時觸發(fā)該事件。WindowEvent
:窗口事件,當窗口狀態(tài)發(fā)生改變(如打開,關(guān)閉,最大化,最小化)時觸發(fā)該事件。FocusEvent
:焦點事件,當級件得到焦點或失去焦點時觸發(fā)該事件。KeyEvent
:鍵盤事件,當按鍵被按下,松開單擊時觸發(fā)該事件。MouseEvent
:鼠標事件,當進行單擊,按下,松開,移動鼠標等動作時觸發(fā)該事件。PaintEvent
:組件繪制事件,該事件是一件特殊的事件類型,當GUI組件調(diào)用update/paint方法來呈現(xiàn)自身時觸發(fā)該事件,該事件并非專用于事件處理模型。
2.高級事件(語義事件)
高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類。
比如,在TextField中按Enter鍵會觸發(fā)ActionEvent事件,在滑動條上稱動滑塊會觸發(fā)AdjustmentEvent事件,選中項目列表的某一項就會觸發(fā)ItemEvent事件。
ActionEvent
:動作事件,當按鈕,菜單項被單擊,在TextField中按Enter鍵時觸發(fā)該事件。AdjustmentEvent
:調(diào)節(jié)事件,在滑動條上稱動滑塊以調(diào)節(jié)數(shù)值時觸發(fā)該事件。ItemEvent
:選項事件,當用戶選中某項,或取消選中某項時觸發(fā)該事件。TextEvent
:文本事件,當文本框,文本域里的文本發(fā)生改變時觸發(fā)該事件。
一件級件被多個監(jiān)聽器監(jiān)聽:
package javaAWT; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.Panel; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MultiListener { private Frame frame = new Frame("MultiListener"); private TextArea textArea = new TextArea(10, 35); private Button btn1 = new Button("one"); private Button btn2 = new Button("two"); public void init() { FirstListener f1 = new FirstListener(); btn1.addActionListener(f1); btn1.addActionListener(new SecondListener()); btn2.addActionListener(f1); frame.add(textArea); Panel panel = new Panel(); panel.add(btn1); panel.add(btn2); frame.add(panel, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } class FirstListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea.append("FirstListener, EventSource :" + e.getActionCommand() + "\n"); } } class SecondListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub textArea.append("Clicked:" + e.getActionCommand() + " Button\n"); } } public static void main(String[] args) { new MultiListener().init(); } }
窗口監(jiān)聽 (WindowListener ):
package javaAWT; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class WindowListenerTest { private Frame frame = new Frame("WindowListener"); private TextArea tArea = new TextArea(6, 40); public void init() { frame.addWindowListener(new MyListener()); frame.add(tArea); frame.pack(); frame.setVisible(true); } class MyListener implements WindowListener { @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub tArea.append("窗口初次打開\n"); } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub tArea.append("關(guān)閉窗口\n"); System.exit(0); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口被關(guān)閉"); } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub tArea.append("窗口最小化\n"); } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub tArea.append("窗口恢復\n"); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub tArea.append("窗口被激活\n"); } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub tArea.append("窗口失去焦點\n"); } } public static void main(String[] args) { new WindowListenerTest().init(); } }
事件適配器
事件適配器是監(jiān)聽器接口的空實現(xiàn)–事件適配器實現(xiàn)了監(jiān)聽器接口,并為該接口里的每個方法都提供了實現(xiàn),這種實現(xiàn)是一種空實現(xiàn)。
監(jiān)聽器接口和事件適配器對應(yīng)表
監(jiān)聽器接口 | 事件適配器 |
---|---|
ContainerListener | ContainerAdapter |
FocusListener | FocusAdapter |
ComponentListener | ComponentAdapter |
KeyListener | KeyAdapter |
MouseListener | MouseAdapter |
MousMotionListener | MouseMotionAdapter |
WindowListener | WindowAdapter |
實現(xiàn)事件監(jiān)聽器有如下幾種形式
1.內(nèi)部類形式:將事件監(jiān)聽器類定義成當前類的內(nèi)部類。
2.外部類形式:將事件監(jiān)聽器類定義成一個外部類。
3.類本身作為事件監(jiān)聽器類:讓當前類本身實現(xiàn)監(jiān)聽器接口或繼承事件適配器。
4.匿名內(nèi)部類形式:使用匿名內(nèi)部類創(chuàng)建事件監(jiān)聽器對象。
內(nèi)部類形式
package javaAWT; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.Image; import java.awt.TextArea; import java.awt.Toolkit; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.ImageIcon; public class WindowAdapterTest { private Frame frame = new Frame("WindowAdapterTest"); private TextArea textArea = new TextArea(6, 40); private ImageIcon imageIcon = new ImageIcon(); public void init() { frame.addWindowListener(new MyAdapterListener()); frame.add(textArea); Image image = Toolkit.getDefaultToolkit().getImage("./123.jpg"); frame.setIconImage(image); frame.pack(); frame.setVisible(true); } class MyAdapterListener extends WindowAdapter { @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub //super.windowClosed(e); System.out.println("Closed window"); System.exit(0); } } public static void main(String[] args) { new WindowAdapterTest().init(); } }
外部類形式
外部類監(jiān)聽器
package javaAWT; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class MailerListener implements ActionListener { private TextField mailAddress; public MailerListener(TextField mailAddress) { // TODO Auto-generated constructor stub this.mailAddress = mailAddress; } public void setMailAddress(TextField mailAddress) { this.mailAddress = mailAddress; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("goto "+mailAddress.getText() + " send eMail"); } }
使用外部監(jiān)聽器
package javaAWT; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.TextField; import org.omg.CORBA.PRIVATE_MEMBER; public class SendMailer { private Frame frame = new Frame("SendMailer"); private TextField tField = new TextField(40); private Button send = new Button("Send"); public void init() { send.addActionListener(new MailerListener(tField)); frame.add(tField); frame.add(send, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new SendMailer().init(); } }
類本身作為事件監(jiān)聽器類
GUI類通過繼承事件適配器方式(extends XxxAdapter),可以只實現(xiàn)需要的監(jiān)聽器事件處理方法。
package javaAWT; import java.awt.Frame; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import org.omg.CosNaming.NamingContextExtPackage.AddressHelper; public class SimpleEventHandler extends WindowAdapter { private Frame frame = new Frame("WindowAdapter"); private TextArea tArea = new TextArea(6, 40); public void init() { //將該類的默認對象作為事件監(jiān)聽對象 frame.addWindowListener(this); frame.add(tArea); frame.pack(); frame.setVisible(true); } // GUI 界面類直接包含事件處理器方法 @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.out.println("Window closed"); System.exit(0); } public static void main(String[] args) { } }
GUI類通過實現(xiàn)事件監(jiān)聽器方式( implements XxxListener),需要實現(xiàn)監(jiān)聽器的所有事件處理方法。
package javaAWT; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.text.TabableView; public class SimpleEventHandlerB implements WindowListener { private Frame f = new Frame("WindowListener"); private TextArea ta = new TextArea(10, 50); public void init() { f.addWindowListener(this); f.add(ta); f.pack(); f.setVisible(true); } @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowOpened"+"\n"); } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowClosing"+"\n"); System.exit(0); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowClosed"+"\n"); } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowIconified"+"\n"); } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowDeiconified"+"\n"); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowActivated"+"\n"); } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub ta.append("windowDeactivated"+"\n"); } public static void main(String[] args) { new SimpleEventHandlerB().init(); } }
匿名內(nèi)部類形式
匿名實現(xiàn)XxxxAdapter對象
package javaAWT; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AnonymousEventHandler { private Frame frame = new Frame("AnonymousEventHandler"); private TextArea textArea = new TextArea(5, 20); public void init() { frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.exit(0); } }); frame.add(textArea); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new AnonymousEventHandler().init(); } }
匿名實現(xiàn)XxxListener對象
package javaAWT; import java.awt.Frame; import java.awt.TextArea; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class AnonymousEventHandlerB { private Frame frame = new Frame("AnonymousEventHandlerB"); private TextArea textArea = new TextArea(5, 50); public void init() { frame.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.exit(0); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } }); frame.add(textArea); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { new AnonymousEventHandlerB().init(); } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中的6種API請求參數(shù)讀取方式總結(jié)
使用Spring Boot開發(fā)API的時候,讀取請求參數(shù)是服務(wù)端編碼中最基本的一項操作,Spring Boot中也提供了多種機制來滿足不同的API設(shè)計要求,通過本文,為大家總結(jié)6種常用的請求參數(shù)讀取方式,需要的朋友可以參考下2024-07-07Springboot啟動同時創(chuàng)建數(shù)據(jù)庫和表實現(xiàn)方法
這篇文章主要介紹了Springboot啟動同時創(chuàng)建數(shù)據(jù)庫和表,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01一文帶你掌握Java?LinkedBlockingQueue
LinkedBlockingQueue?是一個可選有界阻塞隊列,這篇文章主要為大家詳細介紹了Java中LinkedBlockingQueue的實現(xiàn)原理與適用場景,感興趣的可以了解一下2023-04-04java 地心坐標系(ECEF)和WGS-84坐標系(WGS84)互轉(zhuǎn)的實現(xiàn)
這篇文章主要介紹了java 地心坐標系(ECEF)和WGS-84坐標系(WGS84)互轉(zhuǎn)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09SpringBoot Session共享實現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01