當前位置:首頁 » 編程語言 » java中的監聽

java中的監聽

發布時間: 2023-03-07 02:04:54

java中的事件監聽是怎麼回事

不是通過線程實現的,它是通過一種注冊--通知機制實現的。在java的設計模式中,有一種模式叫:觀察者模式,和這個類似。舉個例子,本例子是一個簡單的監聽當數據發生變化時要做的操作。 1,我們先定義一個介面,可以讓多個監聽者實現 public interface IDataListen {public void update(Object event,Object msg);}2,實現一監聽者 public class DataListen implements IDataListen{ @Override public void update(Object event, Object arg) { // TODO Auto-generated method stub System.out.println("數據發生了變化"); }}3,被監聽者 public class DataManager{ private List<IDataListen> listenList = new ArrayList<>(); public void notifyListen(Object event,Object msg){ for(IDataListen dataListen : listenList){ dataListen.update(null, null); } } public void addListen(IDataListen dataListen){ listenList.add(dataListen); } public void updateData(Object msg){ this.notifyListen(null, msg); } public static void main(String[] args) { DataManager dataManager = new DataManager(); IDataListen dataListen1 = new DataListen(); ...

Ⅱ 如何實現java在後台監聽鍵盤

操作系統,有兩個層次,第一個層次是對組裝起電腦的各個硬體的驅動程序;第二個是建立在驅動程序上的各項應用程序,比如桌面顯示、鍵盤監聽後的處理程序等等。如果想要進行監聽鍵盤,那麼就需要獲取到所使用操作系統給出的api介面,以windows系統為例,是用c和c++進行編寫的,所以他們提供的api都是c和c++的api介面。於是用java的話就需要用到java的native方法,一個Native Method就是一個java調用非java代碼的介面。所以3個步驟:
1、引用java native方法。
2、研究windows api。
3、調用windows api中的鍵盤監聽介面,完成程序。

Ⅲ 在程序中(java,C#)監聽器是啥玩意

監聽器即listen,指的是被動監聽,舉例來說我有一個溫度計,它一直監聽著溫度,如果溫度發生了變化水銀柱的高度就發生變化,這里溫度計是一個監聽器,溫度變化是一個事件,當這個時間出發了監聽器時,則得到水銀柱高度變化這么個結果,你懂了么?

Ⅳ java監聽器原理

  • Java最新的事件處理方法是基於授權事件模型,事件源生成事件並將其發送至一個或多個監聽器,監聽器簡單地等待,直到它收到一個事件。一旦事件被接受,監聽器將處理這些事件,然後返回。


  • 事件:在授權事件模型中,事件是一個描述事件源狀態改變的對象。 通過滑鼠、鍵盤與GUI界面直接或間接交互都會生成事件。如:按下一個按鈕、通過鍵盤輸入一個字元、選擇列表框中的一項、點擊一下滑鼠等。


  • 事件源:事件源是一個生成事件的對象

  1. 一個事件源可能會生成不同類型的事件,事件源提供了一組方法,用於為事件注冊一個或多個監聽器。

  2. 每種事件的類型都有其自己的注冊方法。一般形式為:publicvoidadd<EventType>Listener(TypeListenere)

  3. AWT採取的事件控制過程:監聽器對象屬於一個類的實例,這個類實現了一個特殊的介面,名為「監聽者介面」

  4. 事件源是一個對象,它可以注冊一個或多個監聽器對象,並向其發送事件對象。

  5. 事件源將在發生事件時向所有注冊的監聽器發送事件對象。

  6. 監聽器對象使用事件對象中的信息來確定它們對事件的響應


  • 事件模型:

  1. 基於代理(授權)事件模型,事件處理是一個事件源授權到一個或者多個事件監聽器。其基本原理是:組件激發事件,事件監聽器監聽和處理事件,可以調用組件的add<EventType>Listener方法向組件注冊監聽器。把其加入到組件以後,如果組件激發了相應類型的事件,那麼定義在監聽器中的事件處理方法會被調用。


  • 此模型主要由以三種對象為中心組成

  1. 事件源由它來激發產生事件

  2. 是產生或拋出事件的對象。

  3. 事件監聽器由它來處理事件

  4. 實現某個特定EventListener介面,此介面定義了一種或多種方法,事件源調用它們以響應該介面所處理的每一種特定事件類型。

  5. 事件具體的事件類型

  6. 事件類型封裝在以java.util.EventObject為根的類層次中。當事件發生時,事件記錄發生的一切事件,並從事件源傳播到監聽器對象

Ⅳ java中如何實現多按鍵同時按下的鍵盤監聽事件

1,為相應的控制項設置KeyListener()的監聽
2,實現介面中的方法
3,主要重寫keyPressed()這個方法
4,書寫邏輯
5,見代碼
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_1&&e.getKeyCode()==KeyEvent.VK_2){
System.out.println("1,2鍵被點擊了。。。");
}
}ps,還可以自己寫一個數組記錄每個按鍵的狀態,根據狀態值進行邏輯處理。

Ⅵ java設計模式-回調、事件監聽器、觀察者模式

轉自( https://my.oschina.net/u/923324/blog/792857 )

背景
關於設計模式,之前筆者寫過工廠模式,最近在使用gava ListenableFuture時發現事件監聽模型特別有意思,於是就把事件監聽、觀察者之間比較了一番,發現這是一個非常重要的設計模式,在很多框架里扮演關鍵的作用。

回調函數
為什麼首先會講回調函數呢?因為這個是理解監聽器、觀察者模式的關鍵。

什麼是回調函數
所謂的回調,用於回調的函數。 回調函數只是一個功能片段,由用戶按照回調函數調用約定來實現的一個函數。 有這么一句通俗的定義:就是程序員A寫了一段程序(程序a),其中預留有回調函數介面,並封裝好了該程序。程序員B要讓a調用自己的程序b中的一個方法,於是,他通過a中的介面回調自己b中的方法。

舉個例子:
這里有兩個實體:回調抽象介面、回調者(即程序a)

回調介面(ICallBack )
public interface ICallBack {
public void callBack();
}
回調者(用於調用回調函數的類)
public class Caller {

}
回調測試:
public static void main(String[] args) {
Caller call = new Caller();
call.call(new ICallBack(){

控制台輸出:

start...

終於回調成功了!

end...

還有一種寫法

或實現這個ICallBack介面類

class CallBackC implements ICallBack{
@Override
public void callBack() {
System.out.println("終於回調成功了!");
}
}
有沒有發現這個模型和執行一個線程,Thread很像。 沒錯,Thread就是回調者,Runnable就是一個回調介面。

new Thread(new Runnable(){
@Override
public void run() {
System.out.println("回調一個新線程!");
}}).start();
Callable也是一個回調介面,原來一直在用。 接下來我們開始講事件監聽器

事件監聽模式
什麼是事件監聽器
監聽器將監聽自己感興趣的事件一旦該事件被觸發或改變,立即得到通知,做出響應。例如:android程序中的Button事件。

java的事件監聽機制可概括為3點:

java的事件監聽機制涉及到 事件源,事件監聽器,事件對象 三個組件,監聽器一般是介面,用來約定調用方式
當事件源對象上發生操作時,它將會調用事件監聽器的一個方法,並在調用該方法時傳遞事件對象過去
事件監聽器實現類,通常是由開發人員編寫,開發人員通過事件對象拿到事件源,從而對事件源上的操作進行處理
舉個例子
這里我為了方便,直接使用jdk,EventListener 監聽器,感興趣的可以去研究下源碼,非常簡單。

監聽器介面
public interface EventListener extends java.util.EventListener {
//事件處理
public void handleEvent(EventObject event);
}

事件對象
public class EventObject extends java.util.EventObject{
private static final long serialVersionUID = 1L;
public EventObject(Object source){
super(source);
}
public void doEvent(){
System.out.println("通知一個事件源 source :"+ this.getSource());
}

}
事件源
事件源是事件對象的入口,包含監聽器的注冊、撤銷、通知

public class EventSource {
//監聽器列表,監聽器的注冊則加入此列表
private Vector<EventListener> ListenerList = new Vector<EventListener>();
//注冊監聽器
public void addListener(EventListener eventListener){
ListenerList.add(eventListener);
}
//撤銷注冊
public void removeListener(EventListener eventListener){
ListenerList.remove(eventListener);
}
//接受外部事件
public void notifyListenerEvents(EventObject event){
for(EventListener eventListener:ListenerList){
eventListener.handleEvent(event);
}
}

}

測試執行
public static void main(String[] args) {
EventSource eventSource = new EventSource();

}
控制台顯示:

通知一個事件源 source :openWindows

通知一個事件源 source :openWindows

doOpen something...

到這里你應該非常清楚的了解,什麼是事件監聽器模式了吧。 那麼哪裡是回調介面,哪裡是回調者,對!EventListener是一個回調介面類,handleEvent是一個回調函數介面,通過回調模型,EventSource 事件源便可回調具體監聽器動作。

有了了解後,這里還可以做一些變動。 對特定的事件提供特定的關注方法和事件觸發

public class EventSource {
...
public void onCloseWindows(EventListener eventListener){
System.out.println("關注關閉窗口事件");
ListenerList.add(eventListener);
}

}
public static void main(String[] args) {
EventSource windows = new EventSource();
/**
* 另一種實現方式
*/
//關注關閉事件,實現回調介面
windows.onCloseWindows(new EventListener(){

}
這種就類似於,我們的窗口程序,Button監聽器了。我們還可以為單擊、雙擊事件定製監聽器。

觀察者模式
什麼是觀察者模式
觀察者模式其實原理和監聽器是一樣的,使用的關鍵在搞清楚什麼是觀察者、什麼是被觀察者。

觀察者(Observer)相當於事件監器。有個微博模型比較好理解,A用戶關注B用戶,則A是B的觀察者,B是一個被觀察者,一旦B發表任何言論,A便可以獲得。
被觀察者(Observable)相當於事件源和事件,執行事件源通知邏輯時,將會回調observer的回調方法update。
舉個例子
為了方便,同樣我直接使用jdk自帶的Observer。

一個觀察者
public class WatcherDemo implements Observer {
@Override
public void update(Observable o, Object arg) {
if(arg.toString().equals("openWindows")){
System.out.println("已經打開窗口");
}
}
}
被觀察者
Observable 是jdk自帶的被觀察者,具體可以自行看源碼和之前的監聽器事件源類似。

主要方法有

addObserver() 添加觀察者,與監聽器模式類似
notifyObservers() 通知所有觀察者
類Watched.java的實現描述:被觀察者,相當於事件監聽的事件源和事件對象。又理解為訂閱的對象 主要職責:注冊/撤銷觀察者(監聽器),接收主題對象(事件對象)傳遞給觀察者(監聽器),具體由感興趣的觀察者(監聽器)執行

/**

}
測試執行
public static void main(String[] args) {
Watched watched = new Watched();
WatcherDemo watcherDemo = new WatcherDemo();
watched.addObserver(watcherDemo);
watched.addObserver(new Observer(){
@Override
public void update(Observable o, Object arg) {
if(arg.toString().equals("closeWindows")){
System.out.println("已經關閉窗口");
}
}
});
//觸發打開窗口事件,通知觀察者
watched.notifyObservers("openWindows");
//觸發關閉窗口事件,通知觀察者
watched.notifyObservers("closeWindows");

控制台輸出:

已經打開窗口

已經關閉窗口

總結
從整個實現和調用過程來看,觀察者和監聽器模式基本一樣。

有興趣的你可以基於這個模型,實現一個簡單微博加關注和取消的功能。 說到底,就是事件驅動模型,將調用者和被調用者通過一個鏈表、回調函數來解耦掉,相互獨立。

「你別來找我,有了我會找你」。

整個設計模式的初衷也就是要做到低耦合,低依賴。

再延伸下,消息中間件是什麼一個模型? 將生產者+服務中心(事件源)和消費者(監聽器)通過消息隊列解耦掉. 消息這相當於具體的事件對象,只是存儲在一個隊列里(有消峰填谷的作用),服務中心回調消費者介面通過拉或取的模型響應。 想必基於這個模型,實現一個簡單的消息中間件也是可以的。

還比如gava ListenableFuture,採用監聽器模式就解決了future.get()一直阻塞等待返回結果的問題。

有興趣的同學,可以再思考下觀察者和責任鏈之間的關系, 我是這樣看的。

同樣會存在一個鏈表,被觀察者會通知所有觀察者,觀察者自行處理,觀察者之間互不影響。 而責任鏈,講究的是擊鼓傳花,也就是每一個節點只需記錄繼任節點,由當前節點決定是否往下傳。 常用於工作流,過濾器web filter。

Ⅶ javaEE中的監聽器有什麼作用

一、概念
監聽器就是一個實現特定介面的普通java程序,這個程序專門用於監聽另一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件後,監聽器某個方法將立即被執行。
二、Servle監聽器
1、編寫 Servlet 監聽器
(1)和編寫其它事件監聽器一樣,編寫servlet監聽器也需要實現一個特定的介面,並針對相應動作覆蓋介面中的相應方法。
(2)和其它事件監聽器略有不同的是,servlet監聽器的注冊不是直接注冊在事件源上,而是由WEB容器負責注冊,開發人員只需在web.xml文件中使用<listener>標簽配置好監聽器,web容器就會自動把監聽器注冊到事件源中。
(3)一個 web.xml 文件中可以配置多個 Servlet 事件監聽器,web 伺服器按照它們在web.xml 文件中的注冊順序來載入和注冊這些 Serlvet 事件監聽器。
配置如下:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

三、就是gui里邊控制項的監聽器了。具體是什麼就要自己看看相關書籍或者源碼了!

Ⅷ java中為什麼要設置監聽器,有什麼用

豬哥解答:
1、private JButton jb=new JButton("按鈕");這句話聲明了一個按鈕,名字叫jb。
2、jb.addActionListener(this);這里給jb那個按鈕設置了監聽,默認為點擊觸發,當然你寫的這個監聽有點怪異~
3、點擊按鈕jb觸發監聽處理方法actionPerformed,在這里可以做你想要的操作,你代碼實現的是改變lab這個label標簽的內容。
4、至於java中為什麼要用監聽,這就像銀行裝監控一樣,監視你的一舉一動,銀行裝監控是為了捕捉每個進銀行的人的動作,預防危險的發生。
java中做監聽同樣是為了監視某個客戶端動作用的,萬一你給我搞破壞怎麼辦(監聽的作用遠不止如此),當然也像平時生活中不是所有的地方都要放監控,要不就沒法過了,java中也不是所有的地方都要放監聽,具體哪裡要放監聽,不該是在課本里學的,應該根據實際工廠、公司的需求來定。

熱點內容
小陳訪問 發布:2024-05-22 08:23:18 瀏覽:221
ftp上傳文件shell 發布:2024-05-22 08:18:05 瀏覽:876
安卓airpords降噪怎麼弄 發布:2024-05-22 08:18:01 瀏覽:492
se腳本 發布:2024-05-22 08:09:07 瀏覽:964
怎麼刪除linux 發布:2024-05-22 08:04:50 瀏覽:149
go和python 發布:2024-05-22 07:58:26 瀏覽:237
at24c02存儲晶元的參考文獻 發布:2024-05-22 07:28:26 瀏覽:727
微信apiphp 發布:2024-05-22 07:26:49 瀏覽:148
編譯kernel的流程 發布:2024-05-22 07:26:47 瀏覽:939
u盤頭戴式耳機怎麼連接安卓手機 發布:2024-05-22 07:25:30 瀏覽:603