Java 动作事件_java按钮动作事件

1. Java事件处理三要素:

1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;

2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;

3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;

2. 事件处理的机制:

1) 首先事件是有不同的类别的,比如按钮单击、菜单项单击等事件就属于“动作事件”(Action Event),而关闭窗口、最小化窗口等事件就属于“窗口事件”(Window Event);

2) 不同类型的事件需要用不同类型的监听器监听;

3) 而监听器是一种类对象,这种类必须实现监听器接口(Listener),对于监听不同类型的事件AWT库准备了不同类型的监听器接口,比如要监听动作事件就必须实现ActionListener接口,监听窗口事件就必须实现WindowListener接口;

!监听器中最重要的就是事件处理方法了,监听器必须在接受事件之后进行处理(响应);

4) 如何实现监听?

i. 首先事件源(发生事件的组件)必须同意我身上发生的事件允许那些监听器监听;

ii. 也就是说想监听它身上发生的事件的监听器必须到它这里注册,即组件必须调用方法addXxxListener将监听器注册到它的监听器列表中;

iii. 当事件发生时就会将事件对象(Event)发送到所有注册过的监听器那里进行处理;

5) 事件源、事件、监听器的对应关系:

i. 首先一个事件源可以产生多种类型的事件,比如窗口右上角的×按钮,当单击它时就会产生两种类型的事件,一个是按钮单击事件(属于Action Event),另一个是窗口关闭事件(属于Window Event);

ii. 监听器接口是什么类型就发送什么类型的事件:如果注册的监听器实现的是ActionEvent的接口,那么上述×按钮就只发送按钮单击事件给它而不会发送窗口关闭事件,除非监听器同时实现了两种类型的接口,那么该监听器就会同时受到两种类型的事件;

iii. 一个事件源可以注册多个监听器:一般符合逻辑的编程思想就是不同监听器监听、处理不同类型的事件,因此对于可以产生多种类型事件的事件源会注册多种类型的监听器,分别负责处理产生的多种事件;

!!当然一个事件源也可以注册多个相同类型的监听器,即比对于同一个事件(按钮单击),事件源注册多个实现ActionListener接口的监听器,那么这些监听器都会受到该事件,可能会疑问,这不是多此一举吗?一种事件就给出一种处理不是很好吗?那是因为有些情况下可能需要一个事件触发多种动作,每个监听器负责实现一个动作;

iv. 一个监听器可以监听多个事件源上的事件,即多个不同的组件用addXxxListener方法注册同一个监听器,那么当不同事件到来时监听器会调用其不同方法进行处理,或者在一个方法内部判断传进来的是什么事件,再进行特殊的处理;

3. 编写事件处理程序的基本流程:

1) 首先需要实现监听器类:自己编写一个类,至少要实现一种类型的监听器接口,并实现接口中所有的事件处理方法;

2) 创建组件,并对组件注册响应的监听器:首先需要创建监听器对象,将监听器对象作为参数传入组件的addXxxListener方法完成注册;

3) 全部工作完成,事件的处理完全自动进行;

4) 简单的示例:处理一个按钮的单击事件

[java] view plain copy

public class AwtTest {

Frame f = new Frame("Event Test");

TextField tf = new TextField(30);

Button ok = new Button("OK");

class OkListener implements ActionListener {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

System.out.println("OK button pushed!");

tf.setText("Hello!");

}

}

public void init() {

f.add(tf);

f.add(ok, BorderLayout.SOUTH);

ok.addActionListener(new OkListener());

f.pack();

f.setVisible(true);

}

public static void main(String[] args) {

new AwtTest().init();

}

}

!!完全按照讲述的顺序进行;

!直接设置编辑框内文本的方法:void TextField.setText(String text);

4. 事件源-监听器多对多示例:

[java] view plain copy

public class AwtTest {

Frame f = new Frame("Multiple Event Test");

TextArea ta = new TextArea(6, 40);

Panel p = new Panel();

Button btn1 = new Button("button1");

Button btn2 = new Button("button2");

class Listener1 implements ActionListener {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

ta.append("Listener1 be activated! Event Source:" + e.getActionCommand() + "\n");

}

}

class Listener2 implements ActionListener {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

ta.append("Listener2 be activated! Event Source:" + e.getActionCommand() + "\n");

}

}

public void init() {

f.add(ta);

p.add(btn1);

p.add(btn2);

f.add(p, BorderLayout.SOUTH);

Listener1 l1 = new Listener1();

Listener2 l2 = new Listener2();

btn1.addActionListener(l1);

btn2.addActionListener(l1);

btn2.addActionListener(l2);

f.pack();

f.setVisible(true);

}

public static void main(String[] args) {

new AwtTest().init();

}

}

!可以看到按钮2可以同时触发两个监听器,输出两条消息,而监听器1同时监听并处理了两个按钮的消息;

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值