java中的AWT事件處理問題
事件處理的過程中,主要涉及3類對象
Event Source(事件源):事件發(fā)生的聲所,如按鈕,窗口,菜單等組件。Event(事件):事件封裝了GUI組件上發(fā)生的特定事情(通常是一次用打操作)。Event Listener(事件監(jiān)聽器):負(fù)責(zé)監(jiān)聽事件源所發(fā)生的事件,并對各種事件做出響應(yīng)處理。
實(shí)現(xiàn)AWT事件處理機(jī)制的步驟如下
1.實(shí)現(xiàn)事件監(jiān)聽器類,該監(jiān)聽器類是一個特殊的java類,必須實(shí)現(xiàn)一個XxxListener接口。
2.創(chuàng)建普通組件(事件源),創(chuàng)建事件監(jiān)聽器對象。
3.調(diào)用addXxxListener()方法將事件監(jiān)聽器對象注冊給普通組件(事件源)。當(dāng)事件源上發(fā)生指定事件時,AWT會觸發(fā)事件監(jiān)聽器,由事件監(jiān)聽器調(diào)用相應(yīng)的方法(事件處理器)來處理事件,事件源上所發(fā)生的事件會作為參數(shù)傳入事件處理器。
AWT的事件類都是AWTEvent類的子類,AWTEvent是EventObject的子類。
AWT事件分為兩在類:低級事件和高組事件
1.低級事件
低級事件是指基于特定動作的事件.比如進(jìn)入,點(diǎn)擊,拖入等動作的鼠標(biāo)事件,當(dāng)組件得到焦點(diǎn)失去焦點(diǎn)時觸發(fā)的事件.
ComponentEvent:組件事件,當(dāng)組件尺寸發(fā)生變化,位置發(fā)生移動,顯示/隱藏狀態(tài)發(fā)生改變時觸發(fā)該事件.ContainerEvent:容器事件,當(dāng)容器里發(fā)生添加級件,刪除組件時觸發(fā)該事件。WindowEvent:窗口事件,當(dāng)窗口狀態(tài)發(fā)生改變(如打開,關(guān)閉,最大化,最小化)時觸發(fā)該事件。FocusEvent:焦點(diǎn)事件,當(dāng)級件得到焦點(diǎn)或失去焦點(diǎn)時觸發(fā)該事件。KeyEvent:鍵盤事件,當(dāng)按鍵被按下,松開單擊時觸發(fā)該事件。MouseEvent:鼠標(biāo)事件,當(dāng)進(jìn)行單擊,按下,松開,移動鼠標(biāo)等動作時觸發(fā)該事件。PaintEvent:組件繪制事件,該事件是一件特殊的事件類型,當(dāng)GUI組件調(diào)用update/paint方法來呈現(xiàn)自身時觸發(fā)該事件,該事件并非專用于事件處理模型。
2.高級事件(語義事件)
高級事件是基于語義的事件,它可以不和特定的動作相關(guān)聯(lián),而依賴于觸發(fā)此事件的類。
比如,在TextField中按Enter鍵會觸發(fā)ActionEvent事件,在滑動條上稱動滑塊會觸發(fā)AdjustmentEvent事件,選中項(xiàng)目列表的某一項(xiàng)就會觸發(fā)ItemEvent事件。
ActionEvent:動作事件,當(dāng)按鈕,菜單項(xiàng)被單擊,在TextField中按Enter鍵時觸發(fā)該事件。AdjustmentEvent:調(diào)節(jié)事件,在滑動條上稱動滑塊以調(diào)節(jié)數(shù)值時觸發(fā)該事件。ItemEvent:選項(xiàng)事件,當(dāng)用戶選中某項(xiàng),或取消選中某項(xiàng)時觸發(fā)該事件。TextEvent:文本事件,當(dāng)文本框,文本域里的文本發(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("窗口恢復(fù)\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("窗口失去焦點(diǎn)\n");
}
}
public static void main(String[] args) {
new WindowListenerTest().init();
}
}事件適配器
事件適配器是監(jiān)聽器接口的空實(shí)現(xiàn)–事件適配器實(shí)現(xiàn)了監(jiān)聽器接口,并為該接口里的每個方法都提供了實(shí)現(xiàn),這種實(shí)現(xiàn)是一種空實(shí)現(xiàn)。
監(jiān)聽器接口和事件適配器對應(yīng)表
| 監(jiān)聽器接口 | 事件適配器 |
|---|---|
| ContainerListener | ContainerAdapter |
| FocusListener | FocusAdapter |
| ComponentListener | ComponentAdapter |
| KeyListener | KeyAdapter |
| MouseListener | MouseAdapter |
| MousMotionListener | MouseMotionAdapter |
| WindowListener | WindowAdapter |
實(shí)現(xiàn)事件監(jiān)聽器有如下幾種形式
1.內(nèi)部類形式:將事件監(jiān)聽器類定義成當(dāng)前類的內(nèi)部類。
2.外部類形式:將事件監(jiān)聽器類定義成一個外部類。
3.類本身作為事件監(jiān)聽器類:讓當(dāng)前類本身實(shí)現(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),可以只實(shí)現(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() {
//將該類的默認(rèn)對象作為事件監(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類通過實(shí)現(xiàn)事件監(jiān)聽器方式( implements XxxListener),需要實(shí)現(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)部類形式
匿名實(shí)現(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();
}
}匿名實(shí)現(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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
攔截Druid數(shù)據(jù)源自動注入帳密解密實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了攔截Druid數(shù)據(jù)源自動注入帳密解密實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
SpringBoot自定義動態(tài)數(shù)據(jù)源的流程步驟
動態(tài)數(shù)據(jù)源,本質(zhì)上是把多個數(shù)據(jù)源存儲在一個?Map?中,當(dāng)需要使用某一個數(shù)據(jù)源時,使用?key?獲取指定數(shù)據(jù)源進(jìn)行處理,本文將給大家介紹一下SpringBoot自定義動態(tài)數(shù)據(jù)源的流程步驟,需要的朋友可以參考下2024-06-06
實(shí)例解析Java程序中正則表達(dá)式的貪婪模式匹配
貪婪模式又叫最大匹配,X?、X*、X+、X{n,}都是最大匹配,例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也許你所期待的結(jié)果是想匹配“<tr>”,但是實(shí)際結(jié)果卻會匹配到“<tr>aava </tr>”,下面我們就來看具體看一下貪婪模式的使用.2016-05-05
java+mysql模擬實(shí)現(xiàn)銀行系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java+mysql模擬實(shí)現(xiàn)銀行系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05
SpringCloud+Redis實(shí)現(xiàn)Api接口限流防止惡意刷接口
接口限流是為了保護(hù)系統(tǒng)和服務(wù),防止因?yàn)檫^多的請求而崩潰,本文主要介紹了SpringCloud+Redis實(shí)現(xiàn)Api接口限流防止惡意刷接口,具有一定的參考價值,感興趣的可以了解一下2024-03-03

