一、事件处理机制
1.概述
Swing组件中的事件处理专门用于响应用户的操作,比如窗口操作、菜单操作、按钮操作、条目(选项)操作等。
在java语言中,事件不是由事件源自己来处理的,而是交给事件监听者来处理,要将事件源(如按钮)和对事件的具体处理分离开来。这就是所谓的事件委托处理模型。
事件委托处理模型由产生事件的事件源、封装事件相关信息的事件对象和事件监听者三方面构成。例如,当按钮被鼠标点击时,会触发一个“操作事件(ActionEvent)”,Java系统会产生一个“事件对象”来表示这个事件,然后把这个事件对象传递给“事件监听者”,由事件监听者指定相关的|接口方法进行处理。为了使事件监听者能够接受到事件对象的信息,事件监听者要事先向事件源进行注册。
2.事件处理对象
(1)事件源(Event Source):事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等;
(2)事件对象(Event):是指封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。
(3)监听器(Listener):负责监听事件源上发生的事情,并对各种事件作出相应处理的对象。不同的组件可以注册的监听器一般不同,都是基于组件自身的功能设置的监听器。常用监听器 如下表所示。
监听器 | 功能 |
AdjustmentListener | 用于接收调整事件的侦听器接口。 |
FocusListener | 用于在组件上接收键盘焦点事件的侦听器界面。 |
KeyListener | 用于接收键盘事件(按键)的侦听器界面。 |
MouseListener | 用于在组件上接收“有趣”鼠标事件(按,释放,单击,输入和退出)的侦听器界面。 |
MouseWheelListener | 用于在组件上接收鼠标滚轮事件的侦听器界面。 |
TextListener | 用于接收文本事件的侦听器界面。 |
WindowListener | 用于接收窗口事件的侦听器界面。 |
WindowStateListener | 用于接收窗口状态事件的侦听器接口。 |
还有些其他的监听器,可以结合组件的使用,通过方法调用的方式查看可以注册的监听器,通过文档说明了解其功能。
3.事件处理流程
事件处理的流程反映了事件对应的功能实现的逻辑,其流程可以用如下图来表示。
二、鼠标事件
在图形用户界面中,用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,主要包括鼠标按下、鼠标松开、鼠标单击、鼠标移入、鼠标退出等。
1.主要事件及处理方法
鼠标事件 | 处理方法 |
---|---|
鼠标单击(鼠标按钮按下并释放) | mouseClicked(MouseEvent e) |
鼠标按下(鼠标按钮按下) | mousePressed(MouseEvent e) |
鼠标释放(鼠标按钮释放) | mouseReleased(MouseEvent e) |
鼠标进入(鼠标移入组件区域) | mouseEntered(MouseEvent e) |
鼠标退出(鼠标从组件区域退出) | mouseExited(MouseEvent e) |
2.常用监听器
(1)MouseListener监听器
该监听器的功能是监听鼠标事件(MouseEvent)。事件源(产生鼠标操作的组件对象)调用addMouseListener()方法注册监听器,使用MouseEvent类表示鼠标事件,常用处理方法如上表所示。
(2)MouseMotionListener监听器
该监听器监听对于鼠标的移动和拖放操作事件。
MouseMoved(MouseEvent e)方法处理鼠标移动事件
MouseDrag(MouseEvent e)处理鼠标拖放事件
3.处理事件模式
(1)使用MouseListener接口处理事件
重写关于鼠标操作的全部5个方法,完成既定功能,举例如下:
JButton btn1 = new JButton("测试按钮");
btn1.setSize(100,30);
btn1.setLocation(250,80);
btn1.addMouseListener(new MouseListener(){
public void mouseReleased(MouseEvent e) {
JOptionPane.showMessageDialog(null, "鼠标放开事件");
}
public void mousePressed(MouseEvent e) {
JOptionPane.showMessageDialog(null,"鼠标按下事件");
}
public void mouseExited(MouseEvent e) {
JOptionPane.showMessageDialog(null,"鼠标退出按钮区域");
}
public void mouseEntered(MouseEvent e) {
JOptionPane.showMessageDialog(null,"鼠标移入按钮区域");
}
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null,"用户点击了按钮");
}
});
(2)使用MouseAdapter接口处理事件
使用MouseAdapter接口处理鼠标事件,这个接口是MouseListener的扩展,要重写的接口根据需要确定,不必全部重写5个方法。举例代码如下。
JButton btn2 = new JButton("btn2");
btn2.setSize(100,30);
btn2.setLocation(170,30);
btn2.addMouseListener(new MouseAdapter() {
//只重写一个需要的方法即可
public void mouseClicked(MouseEvent e) {
JOptionPane.showMessageDialog(null,"用户点击了按钮btn2");
}
});
(3)使用ActionListener接口处理事件(动作事件)
使用该接口时,只需要重写actionPerformed(ActionEvent e)方法即可,基本能完成多数按钮单击对应的功能,示例代码如下。
JButton btn = new JButton("按钮");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "单击按钮");
}
}
现。示例代码如下。
三、动作事件
不代表某类事件,只是表示一个动作发生了,如关闭文件事件(可能是用键盘关闭,也可以是用鼠标关闭)。
动作事件用ActionEvent类表示,注册监听和处理事件要实现ActionListener接口。
常用的方法有getActionCommand(),用以返回产生动作的事件源对象。
该类时间监听器的注册与方法应用见前面鼠标事件处理模式中示例。
四、键盘事件
键盘事件是指程序运行中,针对键盘上某键的按下、释放、键入动作的事件。
使用KeyEvent类表示键盘事件,实现KeyListener接口或继承KeyAdapter适配器类,使用addKeyListener()方法在事件源上注册监听器。
1.使用KeyListener接口处理事件
注册监听要重写接口中的三个方法:当某键按下后重写调用KeyPressed(keyEvent e)方法,键释放后重写调用KeyReleased(KeyEvent e)方法,键入键时重写KeyTyped(KeyEvent e)方法。
示例代码如下:
JTextField txt = new JTextField();//创建一个文本框
txt.setSize(140,40);
txt.setLocation(230, 100);
txt.addKeyListener(new KeyListener() {//使用keyListener类,重写三个抽象方法
public void keyPressed(KeyEvent e) {
char keychar = e.getKeyChar();//获取键盘键入的字符
JOptionPane.showMessageDialog(null, "键盘按下的字符为"+String.valueOf(keychar));
}
public void keyReleased(KeyEvent e) { }//该事件不做处理
public void keyTyped(KeyEvent e) { } //该事件不做处理
});
2.继承KeyAdapter适配器类处理事件
KeyListener接口中的三个方法(按下键、释放键、键入键)可以不必全部实现,根据需要实现一个或多个即可,即只重写需要的方法即可。改写前面的程序代码如下:
JTextField txt = new JTextField();
txt.setSize(140,40);
txt.setLocation(230, 100);
txt.addKeyListener(new KeyAdapter() {//使用KeyAdapter适配器类根据需要重写方法
public void keyPressed(KeyEvent e) {//只重写按下键方法即可
char keychar = e.getKeyChar();
JOptionPane.showMessageDialog(null, "键盘按下的字符为"+String.valueOf(keychar));
}
});
五、窗体事件
对窗体(JFrame)的各种操作行为都属于窗体事件,如窗体的打开、关闭、激活、停用等。Java中使用WindowsEvent类表示窗体事件,使用WidowsListener接口的实现处理窗体事件。
1.常见窗体事件
windowOpened,打开窗体
windowActivated ,激活(获得焦点状态)窗体
windowDeactivated,窗体非激活(失去焦点状态)
windowIconified,最小化窗体
windowDeiconified,最小化窗体并恢复正常
windowClosing ,关闭(右上角X),优先于windowClosed
windowClosed ,关闭,使用常数DISPOSE_ON_CLOSE时才会被调用
2.处理模式
使用addWindowListener( )方法注册监听器到事件源上(绑定事件源对象),重写前面提到7个有关方法。简单举例如下。
JFrame frame = new JFrame("窗体事件处理示例");
frame.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
});
以上就JavaSwing中事件处理机制及常见事件简单介绍,详细内容可查阅官方说明文档。从事件源角度,对应Java Swing中不同的组件会产生不同的事件,注册的监听器也不同,后续会就组件监听及事件处理做举例介绍。