GUI界面程式启动后,Java虚拟机就启动三个线程:主线程、系统工具包线程和事件派发线程。
1主线程 :负责创建并显示该程序的初始界面;
2系统工具包线程 :负责将从系统事件队列捕获在该程序界面上的鼠标和键盘操作等底层事件,并把这些事件转换成Swing的相应对应事件对象放入Swing的事件队列中,并循环该线程;
3事件派发线程 :负责GUI组件的绘制和更新,通过不断从Swing的事件队列中获取Swing事件对象并调用事件监听器的事件处理方法来处理事件对象,进行交互,这个过程不断循环,直到程序退出。
Swing组件会产生许多事件,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户的鼠标点击行为,点击按钮、列表框中值的改变、计时器开始计时等行为。
举例,用户点击按钮或选择菜单项目时,Swing组件会产生一个ActionEvent。通过注册监听器,我们可以监听事件源产生的事件。
事件(Event) 一个对象,它描述了发生什么事情。用户对界面操作在java语言上的描述,以类的对象形式出现,例如键盘操作对应的事件对象是KeyEvent。
事件源(Event source)产生事件的组件对象,通常就是各个组件,如按钮JButton。
事件监听器(Event listener)一个对象,调用事件处理方法的对象。
事件处理方法(Event handler) 一个方法函数,接收、解析和处理事件类对象、实现和用户交互
的方法。
定义多种事件类型,事件继承图关系如下:
在Java Swing编程中处理各组件事件的一般步骤是:
1新建一个GUI界面
2再建一个组件(如JButton)
3将该组件添加到相应的面板(如JPanel)
4注册监听器以监听事件源产生的事件:调用其成员方法 addActionListener()与监听器对象建立了监听和被监听的关系
5定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。
案例代码
package javaapplication11;
import java.awt.*;
import java.awt.event.ActionListener;
public class JavaApplication11 {
public static void main(String[] args) {
Frame f = new Frame("Test");
Button b = new Button("Press Me!");
Monitor bh = new Monitor();
b.addActionListener(bh);
f.add(b,BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
class Monitor implements ActionListener {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println("a button has been pressed");
}
}
运行效果
用户每次鼠标单击“Press Me!”按钮时,程序都会在控制台窗口中输出一行字符串“a button has been pressed”
事件运行机制说明
1,程序中,Button 对象b作为事件源组件,调用其成员方法 addActionListener()与监听器对象 bh 建立了监听和被监听的关系,这一过程称为注册监听器。
2,然后,当按钮b受到用户鼠标单击时,会触发ActionEvent事件,即创建一个ActionEvent类型的对象并将之提交给运行时系统。
3,运行时系统再将此其转发给此前曾在 b 上注册过的监听器 bh,并以其做为实参自动调用bh的相应事件处理方法actionPerformed()。
以上我们可看出事件监听器类型和对应的事件处理方法都是事先约定好的。
JDK的java.awt.event包中定义了一系列的事件监听器接口,在这些接口中定义了各种 Java GUI 事件处理方法,只有这些接口的实现类的对象才有资格做为监听器,去处理相应的事件。
例如,在上面案例代码中ActionListener接口中定义的actionPerformed()方法是专门用于处理ActionEvent类型事件。
常用Java GUI事件监听器接口
事件适配器
为简化编程, 针对大多数事件监听器接口定义了相应的实现类----事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。然后程序员在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。
常用的事件适配器类:
ComponentAdapter(组件事件适配器)
ContainerAdapter(容器事件适配器)
FocusAdapter(焦点事件适配器)
KeyAdapter(键盘事件适配器)
MouseAdapter(鼠标事件适配器)
MouseMotionAdapter(鼠标运动事件适配器)
WindowAdapter(窗口事件适配器)