『壹』 java 自定义事件的触发及监听
JAVA事件响应机制
1,先自定义一个事件
public class MyEvent extends java.util.EventObject{
public MyEvent(Object source)
{
super(source);
}
}
2,再自定义一个监听器
public class MyListener implements java.util.EventListener{
//这里是当事件发生后的响应过程
public void EventActivated(MyEvent me)
{
System.out.println("事件已经被触发");
}
}
3,以下这个类为触发事件的事件源
public class MyObject {
private Vector vectorListeners=new Vector();
public synchronized void addMyListener(MyListener ml)
{
vectorListeners.addElement(ml);
}
public synchronized void removeMyListener(MyListener ml)
{
vectorListeners.removeElement(ml);
}
protected void activateMyEvent()
{
Vector tempVector=null;
MyEvent e=new MyEvent(this);
synchronized(this)
{
tempVector=(Vector)vectorListeners.clone();
for(int i=0;i<tempVector.size();i++)
{
MyListener ml=(MyListener)tempVector.elementAt(i);
ml.EventActivated(e);
}
}
}
//定义一个公用方法用于触发事件
public void test()
{
activateMyEvent();
}
}
4,测试类
public class Test {
public static void main(String[] args)
{
MyObject mo=new MyObject();
//注册该事件
mo.addMyListener(new MyListener());
//触发该事件
mo.test();
}
}
『贰』 濡備綍鍦╯truts+spring+hibernate椤圭洰涓瀹炵幇瀵圭嚎绋嬬殑鐩戞帶锛
鍦↗ava Web椤圭洰涓锛岀粡甯歌佸湪椤圭洰寮濮嬭繍琛屾椂鍚鍔ㄤ竴涓绾跨▼锛屾瘡闅斾竴瀹氱殑鏃堕棿灏辫繍琛屼竴瀹氱殑浠g爜锛屾瘮濡傛壂鎻忔暟鎹搴撶殑鍙樺寲绛夌瓑銆傝佸疄鐜拌繖涓鍔熻兘锛屽彲浠ョ幇鍦╳eb.xml鏂囦欢涓瀹氫箟涓涓狶istener锛岀劧鍚庡湪杩欎釜Listener涓鍚鍔ㄤ竴涓绾跨▼锛屽湪绾跨▼閲岄潰瀹炵幇鍔熻兘銆
1. 鑷瀹氫箟Listener
鍦⊿truts+Spring+Hibernate鐨刉eb椤圭洰涓锛寃eb.xml閲岄潰涓鑸閮戒細鏈夎繖鏍风殑浠g爜锛
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
杩欏嚑鍙ヤ唬鐮佷娇寰梂eb椤圭洰鐨勫瑰櫒锛堜篃灏辨槸Web鏈嶅姟鍣锛屾瘮濡俆omcat锛夊湪椤圭洰鍚鍔ㄦ椂瀹炰緥鍖栦簡涓涓猳rg.springframework.web.context.ContextLoaderListener绫汇
绫讳技鐨勶紝鎴戜滑涔熷彲浠ュ湪web.xml閲岄潰鑷宸卞畾涔変竴涓狶istener锛岃¦eb鏈嶅姟鍣ㄥ幓瀹炰緥鍖栵細
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.XXX.listener.WSListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
鍦ㄤ互涓婄殑web.xml鏂囦欢涓锛屾垜浠灏辫¦eb鏈嶅姟鍣ㄥ湪鍚鍔ㄦ椂瀹炰緥鍖栨垜浠鑷宸卞畾涔夌殑com.XXX.listener.WSListener绫伙紙涓鑸鑷宸卞畾涔夌殑Listener绫昏佸啓鍦╫rg.springframework.web.context.ContextLoaderListener鐨勫悗闈锛夛紝鐒跺悗鍦ㄨョ被涓鍘诲惎鍔ㄧ嚎绋嬶細
public class WSListener implements ServletContextListener{
private WSThread wsThread;
@Override public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub
if (wsThread != null && wsThread.isRunning){
wsThread.stopThread();
}
}
@Override public void contextInitialized(ServletContextEvent event) { // TODO Auto-generated method stub
if (wsThread == null){
wsThread = new WSThread(event);
wsThread.start();
}
}
}
Listener绫绘槸鐢盬eb鏈嶅姟鍣ㄧ$悊鐨勶紝褰揥eb鏈嶅姟鍣ㄥ惎鍔ㄦ椂锛屽皢Listener绫诲疄渚嬪寲骞惰皟鐢ㄥ叾contextInitialized(ServletContextEvent event)鏂规硶锛屽綋Web鏈嶅姟鍣ㄥ叧闂鏃讹紝璋冪敤鍏禼ontextDestroyed(ServletContextEvent event)鏂规硶锛屽洜姝ゆ垜浠鍙浠ュ垎鍒鍦ㄨ繖涓や釜鏂规硶閲岄潰瀹炵幇绾跨▼鐨勫惎鍔ㄥ拰缁撴潫銆
2. 鍦⊿pring瀹瑰櫒浠ュ栬幏寰楀叾鍐呴儴鐨凚ean鐨勫疄渚嬬殑寮曠敤
琚鍚鍔ㄧ殑绾跨▼鐢ㄤ簬闂撮殧涓瀹氱殑鏃堕棿鎵鎻忎竴娆℃暟鎹搴擄紝鎵惧嚭鏂板炲姞鐨勬暟鎹銆傚湪涓鑸鐨凷truts+Spring+Hibernate鐨刉eb椤圭洰涓锛孲pring瀹瑰櫒涓鐨凚ean鏄鐢盨pring瀹瑰櫒绠$悊鐨勶紝鑰屾垜浠杩欓噷鍚鍔ㄧ殑绾跨▼骞朵笉鍦⊿pring瀹瑰櫒涓锛岄偅涔堟庢牱鑾峰緱Spring瀹瑰櫒涓瑽ean鐨勫疄渚嬬殑寮曠敤杩涜岃块棶鏁版嵁搴撳憿锛熷彲浠ヤ娇鐢⊿pring鐨刉ebApplicationContextUtils宸ュ叿绫伙紝璇ュ伐鍏风被鑾峰緱Spring瀹瑰櫒鐨勫紩鐢锛屽啀鑾峰緱鍏跺唴閮ㄧ殑Bean鐨勫疄渚嬬殑寮曠敤銆
绾跨▼鐨勪唬鐮侊細
public class WSThread extends Thread{ public volatile boolean isRunning = true; // 涓ゆ℃壂鎻忎箣闂翠紤鐪犵殑鏃堕棿
public long s_time; private WebApplicationContext context; private PropService propService; private Prop prop; private Temp2Service temp2Service; private Temp2 temp2;
private TempService tempService;
ServletContextEvent event; public WSThread(ServletContextEvent e){ this.event = e; this.context = WebApplicationContextUtils.(event.getServletContext()); this.propService = (PropService) context.getBean("propService"); this.temp2Service = (Temp2Service) context.getBean("temp2Service");
}
public void run(){ while (isRunning){ try { this.prop = propService.findByName("scan_time"); this.s_time = Integer.parseInt(prop.getValue())*1000;
sleep(s_time);
System.out.println("Run!!!!!!");
} catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace();
}
}
}
public void stopThread(){
isRunning = false;
}
public boolean isRunning(){ return isRunning;
}
}
鍦ㄨョ嚎绋嬬殑鏋勯犲嚱鏁颁腑锛屼娇鐢ㄤ簡浠嶭istener浼犺繃鏉ョ殑ServletContextEvent鍙橀噺锛岀敤璇ュ彉閲忕殑getServletContext()鏂规硶锛岃幏鍙朩eb椤圭洰鐨剆ervletContext锛岀劧鍚庡啀浠ヨ繖涓猄ervletContext浣滀负鍙傛暟锛屼娇鐢╓ebApplicationContextUtils鐨刧()鏂规硶鑾峰彇ApplicationContext瀵硅薄锛屾渶鍚庡啀閫氳繃ApplicationContext鐨刧etBean()鏂规硶鑾峰彇鍒癇ean鐨勫疄渚嬶紝瀹炵幇瀵规暟鎹搴撶殑璁块棶銆
『叁』 浅析Java语言的事件处理快捷回复
在JAVA程序设计中 事件的处理是非常重要的 尤其是在需要自定义事件和设计JavaBean时 对事件的处理过程有一个完整的认识对于编程是很有帮助的
下面用一个演示性的例子来说明事件及其处理过程
一 事件的组成
如果想要自定义一个事件 则必须提供一个事件的监听接口以及一个事件类 在JAVA中监听接口继承java util EventListener 事件类继承java util EventObject 很多基本的事件在编程环境中都已经提供可以很方便使用 但是在自定义事件中必须要要了解这些
下面是一个事件类的代码 事件类可以向用户处理程序提供被监听类的信息
import java util *;
public class PropertyEvent extends EventObject {
public PropertyEvent(){}
}
下面是监听接口的代码
import java util *;
public interface PropertyListener extends EventListener {
public void propertyChanged(PropertyEvent propertyEvent);
}
二 事件的处理机制
下面是一段简要的被监听类代码 通过代码分析事件处理过程
import java util *;
public class Exam {
private int property;
//listeners用来存放已注册的监听对象
private Set listeners= new HashSet();
public void addListener(PropertyListener propertyListener){
//listeners必须保证只能被一个线程访问
synchronized(listeners){
listeners add(propertyListener);
}
}
public void firePropertyChange(){
Iterator iterator;
synchronized(listeners){
//将listeners中的类名放到iterator
iterator = new HashSet(erator();
}
//创建事件类
PropertyEvent propertyEvent = new PropertyEvent();
while(iterator hasNext()){
PropertyListener propertyListener = (propertyListener) iterator next();
//调用用户的事件处理程序
propertyListener propertyChanged(propertyEvent);
}
}
}
当属性值发生变化时 首先进行内部处理调用firePropertyChange方法 产生一个事件对象然后用事件对象为参数来调用用户的事件处理程序
三 事件处理的使用
基本用法
public Exam exam;
exam addListener(this);
public void propertyChange(PropertyEvent event){ }
注 exam是被监听对象 this为监听对象 是已经实现了接口方法的当前类 addListener
将当前类注册到listeners
一个被监听对象可以有多个监听对象
exam addListener(listener );
exam addListener(listener );
这样当exam的property发生变化时 actionListener 和actionListener 的处理程序都会
被调用 当然listener 和listener 必须都是已实现接口方法的类
被监听的对象也可以是实现了方法的接口
exam addListener(
new PropertyListener(){
//用户定义事件处理过程
public void propertyChange(PropertyEvent event){
}
);
lishixin/Article/program/Java/hx/201311/26740
『肆』 JAVA添加按钮监听器
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class ShowButton implements ActionListener{
private JTextField textField = null;
private JButton button = null;
private JFrame frame = null;
public ShowButton(){
frame = new JFrame("显示按钮文字");
button = new JButton("3");
textField = new JTextField("",20);
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
frame.add(textField);
button.addActionListener(this);
frame.add(button);
frame.setSize(400, 100);
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
textField.setText("");
textField.setText(button.getActionCommand());
System.out.println(button.getActionCommand()+"===");
}
public static void main(String[] args) {
new ShowButton();
}
}
『伍』 关于java的监听器
1、public void addWindowListener(WindowListener l)添加指定的窗口侦听器,以从此窗口接收窗口事件。如果 l 为 null,则不抛出任何异常,且不执行任何操作。
这个是API中的方法定义,此方法参数为接口WindowListener,任何实现该接口的类都可以作为参数。
2、public abstract class WindowAdapterimplements WindowListener, WindowStateListener, WindowFocusListener
接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
扩展此类可创建 WindowEvent 侦听器并为所需事件重写该方法。(如果要实现
WindowListener 接口,则必须定义该接口内的所有方法。此抽象类将所有方法都定义为
null,所以只需针对关心的事件定义方法。)
使用扩展的类可以创建侦听器对象,然后使用窗口的 addWindowListener
方法向该窗口注册侦听器。当通过打开、关闭、激活或停用、图标化或取消图标化而改变了窗口状态时,将调用该侦听器对象中的相关方法,并将
WindowEvent 传递给该方法。
3、如果我想在代码中一次性使用某个类(抽象类或具体类)或接口,可以使用匿名类的方式,这样不需自己定义一个My***类,然后再使用,比较方便。用法就是直接在new WindowAdapter()后面加入类定义,在其中实现或覆盖方法就可以了。
匿名类不是返回值,而是相当于new String(“hello”)这种的扩展形式。我觉得匿名类的最多用处就是加监听器时。
附上WindowAdapter源代码:
implementsWindowListener,WindowStateListener,WindowFocusListener
{
publicvoidwindowOpened(WindowEvente){}
publicvoidwindowClosing(WindowEvente){}
publicvoidwindowClosed(WindowEvente){}
publicvoidwindowIconified(WindowEvente){}
publicvoidwindowDeiconified(WindowEvente){}
publicvoidwindowActivated(WindowEvente){}
publicvoidwindowDeactivated(WindowEvente){}
publicvoidwindowStateChanged(WindowEvente){}
publicvoidwindowGainedFocus(WindowEvente){}
publicvoidwindowLostFocus(WindowEvente){}
}
『陆』 java怎样监听一个值是否发生了变化,具体代码
java 自定义监听器监听属性变化
import java.util.EventObject;
public class MyEvent extends EventObject
{
private Object obj;
private String sName;
public MyEvent(Object source,String sName)
{
super(source);
this.obj=source;
this.sName=sName;
}
public Object getObj()
{
return obj;
}
public String getsName()
{
return sName;
}
}
import java.util.EventListener;
public interface MyEventListener extends EventListener
{
public void handleEvent (MyEvent me);
}
import java.util.Iterator;
import java.util.Vector;
import demo.DemoEvent;
public class MyEventSource
{
private Vector list=new Vector();
private String sName = "";
public MyEventSource()
{
super();
}
public void addMyEventListener(MyEventListener me)
{
list.add(me);
}
public void deleteMyEventListener(MyEventListener me)
{
list.remove(me);
}
public void notifyMyEvent(MyEvent me)
{
Iterator it=list.iterator();
while(it.hasNext())
{
((MyEventListener) it.next()).handleEvent(me);
}
}
public void setName(String str)
{
boolean bool = false;
if (str == null && sName != null)
bool = true;
else if (str != null && sName == null)
bool = true;
else if (!sName.equals(str))
bool = true;
this.sName = str;
// 如果改变则执行事件
if (bool)
notifyMyEvent(new MyEvent(this, sName));
}
public String getsName()
{
return sName;
}
}
public class Test implements MyEventListener
{
public Test()
{
MyEventSource mes = new MyEventSource();
mes.addMyEventListener(this);
mes.setName("niu");
}
public static void main(String args[])
{
new Test();
}
public void handleEvent(MyEvent me)
{
System.out.println(me.getSource());
System.out.println(me.getsName());
}
}
『柒』 java自定义事件,线程a如何每一秒钟触发一个事件,然后另一个线程b监听之,并作出反应
思路,在线程b的操作中调用a.wait(),线程a中触发的事件后面添加notify(),则在b执行到a.wait()的时候,回b等待a,a执行到notify(),通知a的等答待列表中的b线程进入锁池,此时b有机会继续执行,这样就打到了线程b监听a执行完事件
『捌』 java中怎样用KeyListener写一个组合的键盘监听事件
最关键的一句:
if(e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown())
我写了一个测试程序你可以看看,快捷是Ctrl+Enter,打印出OK
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Test extends JFrame implements KeyListener {
Test() {
this.addKeyListener(this);
this.setBounds(0,0,100,100);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void keyPressed(KeyEvent e) {
// TODO 自动生成方法存根
if(e.getKeyCode() == KeyEvent.VK_K && e.isControlDown()){
System.out.println("OK");
}
}
public static void main(String[] args) {
new Test();
}
public void keyReleased(KeyEvent e) {
// TODO 自动生成方法存根
}
public void keyTyped(KeyEvent e) {
// TODO 自动生成方法存根
}
}