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);
}
});
}
}
注:文章中的部分内容和图片来自传智播客提供的资料,感谢资源共享的互联网时代。