java事件处理机制

1、事件 、事件源、监听器、事件处理 

事件监听机制可以用下面的一张图来类比:


事件源:就是awt包或者swing包中的那些图形界面组件,如Butten,Frame。在这里就是密码锁。

事件:相当于外力,能够引起监听器反应的事件,每一个事件源都对应有自己的事件和与其他事件源共同拥有的事件,XXXEvent。

监听器:这个java已经定义好了,只需要通过addXXXListener(XXXlistener)将监听器注册到事件源上即可。

事件处理:以上三部分在java中都有定义,可以直接供用户调用,只有这部分事件处理是我们自定义的,想怎么玩就怎么玩。

2、创建一个简单的窗体程序大概如流程所示:

 
  1、创建一个Frame窗体
  2、对窗体进行基本设置
  3、定义一些组件
  4、将组件通过窗体的add方法添加到窗体中
  5、添加组件和窗体的事件处理方式。
  6、通过setVisible(true)让窗体显示出来。
  7、一般可以将这个流程分为几个模块,以FrameDemo为例,分为构造函数、初始化函数、事件处理函数
  初始化函数中主要是定义的窗体和各种组件之间的关系,事件处理函数中主要放所有组件的事件处理方式,这样在新建一个窗体时,通过初始化函数调用事件处理 函数,构造函数调用初始化函数的方式,就可以完成一个简单的窗体。

3、如何查API

  在学习事件处理机制的时候想要给哪个组件添加事件,就要查那个组件支持注册哪种监听器,注册上监听器之后再去覆盖自己 想要的监听器中的方法。同时 要注意事件类(XXXEvent)的使用。

4、java中awt中所有组件的关系

5、样例程序

import java.awt.*;
import java.awt.event.*;

public class FrameDemo {
	
	private Frame f;
	private Button btn;
	private TextField tf;
	//构造函数
	FrameDemo(){
		init();
	}
	//初始化函数
	public void init(){
	
		f = new Frame("我的窗口");
		
		f.setSize(500,400);
		f.setLocation(100, 200);
		f.setLayout(new FlowLayout());
		
		btn  = new Button("button");
		tf = new TextField(20);
		
		f.add(btn);
		f.add(tf);
		
		event();
		
		f.setVisible(true);
		
	}
	//事件函数
	public void event(){
		
		f.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}	
		});
		
		btn.addActionListener(new ActionListener(){
			
			public void actionPerformed(ActionEvent e) {
				System.out.println("actionPerformed");
			}
		});
		
		btn.addMouseListener(new MouseAdapter(){
			
			public void mouseMoved(MouseEvent e) {
				System.out.println("mouseMoved");
			}
			
			public void mouseEntered(MouseEvent e) {
				System.out.println("mouseEntered(MouseEvent e)");
			}
			
			public void mouseClicked(MouseEvent e){
				if(e.getClickCount() == 2)       //通过查找mouseevent 的方法得知有个获取鼠标点击次数的函数,直接设置为二就可以了
				System.out.println("鼠标双击了");
			}
		
		});
		
		tf.addKeyListener(new KeyAdapter() {
			
			public  void keyPressed(KeyEvent e){
				if(e.getKeyCode() == KeyEvent.VK_ENTER)   //单键盘事件的设计
					System.out.println("你疯了");
				if(e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_ENTER)  //任意组合件的设计
					System.out.println("你简直是疯了");
				if(!(e.getKeyCode() >=KeyEvent.VK_0 && e.getKeyCode()<=KeyEvent.VK_9)){
					System.out.println("输入的东西必须是数字哟");
					e.consume();
				}
			}
		});
	
	
	}
		
//主函数,用于测试
	public static void main(String[] args) {		
		new FrameDemo();
	}

}

如果让自定义的类名继承Frame的话那么就不用定义Frame类了,直接使用this或者是什么都不加。例如下面的程序,只作为一个演示,并没有添加太多的事件处理。


package com.missss;

import java.awt.*;
import java.awt.event.*;

public class FrameDemo {
	public static void main(String[] args){
		new MyFrame();
	}
	
}

class MyFrame extends Frame
{//如果让自定义的类名继承Frame的话那么就不用定义Frame类了,直接使用this或者是什么都不加。
	Button btn;
	TextField tf;
	TextArea ta;
	MenuBar mb;
	Menu m,m1;
	MenuItem mi;
	
	public MyFrame(){
		init();
	}
	
	private void init(){
		/*初始化窗体位置和窗体大小*/
		this.setBounds(300, 200, 500, 400);
		this.setLayout(new FlowLayout());
		
		/*定义需要添加的控件*/
		btn = new Button("我的按钮");
		tf = new TextField();
		ta = new TextArea();
		mb = new MenuBar();
		m = new Menu("菜单");
		m1 = new Menu("子菜单");
		mi = new MenuItem("子类目");
		
		/*向窗体中添加控件*/
		this.add(btn);
		this.add(tf);
		this.add(ta);
		this.setMenuBar(mb);
		mb.add(m);
		m.add(mi);
		m.add(m1);
		
		/*调用事件方法*/		
		this.myEvent();
		
		/*使窗体显示出来*/
		this.setVisible(true);	
	}
	/**
	 * 添加事件方法
	 */
	private void myEvent(){
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
	}
}
注:文章中的部分内容和图片来自传智播客提供的资料,感谢资源共享的互联网时代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此人姓于名叫罩百灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值