基于Java?GUI?事件處理方式
事件處理主要涉及:事件源,事件,事件處理者
在GUI中事件源是事件發(fā)生的場所,通常是各個組件,如被單擊的按鈕;事件是用戶對界面的操作,如操作鍵盤是觸發(fā)的鍵盤事件;而事件處理者則是對收到的事件經(jīng)行處理的程序,也稱監(jiān)聽器。
java.awt.event包中實(shí)現(xiàn)對事件處理的相關(guān)類和接口
- 以Event結(jié)尾的類:事件類,如ActionEvent , WindowEvent , MouseEvent , KeyEvent
- 以Listener結(jié)尾的接口:是一些與特定事件相關(guān)的的監(jiān)聽器接口,每個接口都定義了需要特定監(jiān)聽器實(shí)現(xiàn)的方法,是事件處理者的具體實(shí)現(xiàn),如ActionListener , WindowListener ,MouseListerer , KeyListener
- 以Adapter結(jié)尾的類(即適配器類):是一些已經(jīng)實(shí)現(xiàn)了所有方法的特殊接口,是為了簡化代碼引入的一種監(jiān)聽器手段,只需要重寫需要的方法即可。但是由于Java的單繼承特性,如果要使用多種監(jiān)聽器或此類已經(jīng)有了父類則無法繼承適配器類了,如 WindowAdapter , MouseAdapter , KeyListener , 無 ActionEvent
注意:
事件處理者,即監(jiān)聽器為了能夠處理某種類型的事件,必須實(shí)現(xiàn)與該事件類型相對的接口,即成為一個實(shí)現(xiàn)某接口的類對象。
事件是通過事件處理者包含的方法傳入的,而該方法就是實(shí)現(xiàn)接口時必須實(shí)現(xiàn)的方法。
如ActionListener接口中的 void actionPerformed( ActionEvent e )方法。
如:單擊按鈕對 應(yīng)于動作事件即(ActionEvent),按鈕事件處理者是實(shí)現(xiàn)例動作事件對應(yīng)的Listener接口的 類對象,需要調(diào)用按鈕的addActionListener()方法注冊,該類是重寫ActionListener 接口中的void actionPerformed( ActionEvent e )方法
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("理解事件處理");
frame.setDefaultCloseOperation(3);
frame.setLayout(null);
//創(chuàng)建按鈕對象
JButton button = new JButton("請單擊本次按鈕");
button.setBounds(120,60,120,30);
frame.add(button);
//創(chuàng)建按鈕監(jiān)聽器并注冊,參數(shù)為事件處理者對象
ButtonHandler buttonHandler = new ButtonHandler();
button.addActionListener(buttonHandler);//與單擊事件相關(guān)的授權(quán)處理的方法
frame.setBounds(400,200,400,200);
frame.setVisible(true);
}
}
class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent e) {
System.out.println("單擊一次按鈕");
}
}
效果圖:

從上例中可以看出編寫事件處理可大致分為三步:
- 第一步:創(chuàng)建某組件對象,并考慮該組件對象與哪個或哪些事件相關(guān)。如創(chuàng)建按鈕對象,相關(guān)的事件是動作事件,即ActionEvent。
- 第二步:編寫該組件對象的事件處理者類,即實(shí)現(xiàn)要處理事件對應(yīng)的監(jiān)聽器接口,如編寫事件處理者ButtonHandler類,實(shí)現(xiàn)ActionEvent對應(yīng)的ActionListener接口,具體來說就是實(shí)現(xiàn)接口中的void actionPerformed( ActionEvent e )方法,在該方法中加入處理事件的代碼。
- 第三步:創(chuàng)建事件處理者類的實(shí)例,并調(diào)用組件對象的對應(yīng)該類事件的添加方法來注冊監(jiān)聽器,如調(diào)用按鈕的addActionListener( ActionListener 1) 方法添加 ButtonHandler類實(shí)例。
例:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test{
public static void main(String[] args) {
JFrame frame = new JFrame("深入掌握事件處理");
frame.setDefaultCloseOperation(3);
frame.setLayout(null);
//創(chuàng)建提示 信息
JLabel label1 = new JLabel("請?jiān)诖绑w內(nèi)移動鼠標(biāo)");
label1.setBounds(15,5,200,25);
frame.add(label1);
JLabel label2 = new JLabel("或按住鼠標(biāo)左鍵拖動鼠標(biāo)");
label2.setBounds(15,30,200,25);
frame.add(label2);
//創(chuàng)建文本框?qū)ο?,檢測
JTextField text = new JTextField(30);
text.setBounds(15,55,200,30);
frame.add(text);
//注冊監(jiān)聽器,參數(shù)為事件處理者對象
MouseListenerImp mouse = new MouseListenerImp(text);//事件處理者類 實(shí)例化
frame.addMouseListener(mouse);
frame.addMouseMotionListener(mouse);
frame.addWindowListener(mouse);
frame.setBounds(500,250,300,150);
frame.setVisible(true);
}
}
//編寫事件處理對象類 實(shí)現(xiàn)鼠標(biāo)窗體的相關(guān)接口
class MouseListenerImp implements MouseListener, MouseMotionListener, WindowListener{
JTextField text;
public MouseListenerImp(JTextField text){
this.text = text;
}
public void mouseDragged(MouseEvent e){ //提供拖拽時的鼠標(biāo)坐標(biāo)
String s = "托拽鼠標(biāo),坐標(biāo): x =" + e.getX() + "y = " + e.getY();
text.setText(s);//在文本框中可輸出
}
public void mouseEntered(MouseEvent e) { //檢查鼠標(biāo)是否在窗體內(nèi)
String s = "鼠標(biāo)離開了窗體";
text.setText(s);//在文本框中可輸出
}
public void mouseExited(MouseEvent e) { //檢查鼠標(biāo)是否在窗體內(nèi)
String s = "鼠標(biāo)進(jìn)入了窗體";
text.setText(s);//在文本框中可輸出
}
public void windowClosing(WindowEvent e) {//為了式窗口能正常關(guān)閉
System.exit(1);
}
//不打算實(shí)現(xiàn)的方法,但是因?yàn)閷?shí)現(xiàn)接口,所以要寫出來
public void mouseMoved(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
}
效果圖:



上述代碼的class MouseListenerImp implements MouseListener, MouseMotionListener, WindowListener 同時實(shí)現(xiàn)了三個接口,要實(shí)現(xiàn)接口需要寫全部重寫接口中的方法,但如果將其中某個接口用Adapter類 代替則可有】優(yōu)化代碼 即 extends MouseAdapter
事件的種類:
- 組件事件
ComponentEvent:組件尺寸的變化和移動 - 容器事件
ContainerEvent:組件增加或移動 - 窗口事件
WindowEvent:關(guān)閉窗口,激活窗口閉合,最大化,最小化 - 焦點(diǎn)事件
FocusEvent:焦點(diǎn)的獲得與失去 - 鍵盤事件
KeyEvent:鍵的按下或釋放 - 鼠標(biāo)事件
MouseEvent:鼠標(biāo)單擊與移動 - 動作事件
ActionEvent:單擊按鈕,在文本框中按Enter鍵 - 項(xiàng)目事件
ItemEvent:從選擇框或列表框中選擇一項(xiàng) - 調(diào)節(jié)事件
AdjustEvent:移滾動條上的滑塊以調(diào)節(jié)數(shù)值 - 文本事件
TextEvent:文本對象的改變
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?常量池詳解之class文件常量池?和class運(yùn)行時常量池
這篇文章主要介紹了Java?常量池詳解之class文件常量池?和class運(yùn)行時常量池,常量池主要存放兩大類常量:字面量,符號引用,本文結(jié)合示例代碼對java class常量池相關(guān)知識介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解
這篇文章主要介紹了SpringSecurity中的EnableWebSecurity注解啟用Web安全詳解,@EnableWebSecurity是Spring?Security用于啟用Web安全的注解,典型的用法是該注解用在某個Web安全配置類上,實(shí)現(xiàn)了接口,需要的朋友可以參考下2023-12-12
Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Idea創(chuàng)建springboot不能選擇java8的解決
在IDEA 2023版本創(chuàng)建Spring Boot項(xiàng)目時,發(fā)現(xiàn)沒有Java 8選項(xiàng),只有Java 17和Java 20,解決方法包括:通過修改服務(wù)器URL(推薦)或直接在創(chuàng)建后修改pom.xml文件中的Spring Boot和Java版本2025-01-01
基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能(兩種驗(yàn)證碼方式)
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)驗(yàn)證碼功能,今天我們介紹的是兩種主流的驗(yàn)證碼,一種就是進(jìn)行計(jì)算的驗(yàn)證碼,另外一種就是不需要計(jì)算,直接輸入的驗(yàn)證碼,需要的朋友可以參考下2024-08-08
java捕獲AOP級別的異常并將其傳遞到Controller層
如何在一個現(xiàn)代的Java應(yīng)用中,捕獲AOP(面向切面編程)級別的異常,并將這些異常傳遞到Controller層進(jìn)行合適的處理,異常處理在構(gòu)建可靠的應(yīng)用程序中起著關(guān)鍵作用,而AOP則可以幫助我們更好地管理和組織代碼,我們將深入研究如何結(jié)合AOP和異常處理來構(gòu)建健壯的應(yīng)用2023-09-09
淺談java對象轉(zhuǎn)json,數(shù)字精確出現(xiàn)丟失問題
下面小編就為大家?guī)硪黄獪\談java對象轉(zhuǎn)json, 數(shù)字精確出現(xiàn)丟失問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03

