Java中,事件处理的基本思路:
1.一个源(事件源)产生一个事件,并把它送到监听器那里,监听器只是简单的对待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件。
2.一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知。
注:事件源是指动作所操纵的对象。另外事件源一定是指某个组件。
AWT事件类的继承体系
AWT事件类型(列表)
常用监听器
1.ActionListener
ActionListener可能是使用最多的监听器,与之对应的事件时ActionEvent,一般在鼠标点击某个按钮时会产生该事件,该接口只包含一个抽象方法,方法的原型是:
public interface ActionListener{
public void actionPerformed(ActionEvent ae);
}
注:其实现类必须重写actionPerformed方法,当事件发生时将调用该方法。
java.awt.event.Actionevent的常用方法:
//返回最初的事件源,从java.util.EventObject继承而来,所有类型的事件对象中都有此方法
Object getSource()
//返回与此动作相关的命令字符串,该命令字符串可以用来表示和区分事件源
String getActionCommand()
2.KeyListener
KeyListener专门用来处理键盘事件,其对应事件类型是KeyEvent,该接口中包含三个抽象方法,分别在不同的时刻被调用,原型如下:
public interface KeyListener
{
/*按下键盘上的某键时调用*/
public void keyPressed(keyEvent ke);
/*释放键盘上的某键时调用*/
public void keyReleased(KeyEvent ke);
/*输入某个字符时调用*/
public void keyTyped(KeyEvent ke);
}
3.MouseListener
操作鼠标时会产生鼠标事件MouseEvent,而MouseListener用来处理鼠标的动作,其原型如下:
public interface MouseListener {
/*鼠标按钮在某个组件上按下时调用*/
public void mousePressed(MouseEvent me);
/*鼠标按钮在某个组件上释放时调用*/
public void mouseReleased(MouseEvent me);
/*鼠标按钮在某个组件上点击(按下并释放)时调用*/
public void mouseClicked(MouseEvent me);
/*鼠标进入到某个组件的范围之内时调用*/
public void mouseEntered(MouseEvent me);
/*鼠标离开某个组件的范围之外时调用*/
public void mouseExited(MouseEvent me);
}
4.MouseMotionListener
MouseMotionListener是专门处理鼠标运动事件的,比如将鼠标进行移动和拖动的时候,该接口的原型如下:
public interface MouseMotionListener
{
/*在某个组件上移动鼠标时调用*/
public void mouseMoved(MouseEvent me);
/*在某个组件上拖动(按下键并移动)鼠标时调用*/
public void mouseDragged(MouseEvent me);
}
java.awt.MouseEvent的常用方法:
//返回事件发生时,鼠标相对于源组件的水平x轴坐标
int getX()
//返回事件发生时,鼠标相对于源组件的垂直y轴坐标
int getY()
//返回事件发生时,是哪个鼠标键被按下,可以是MouseEvent.BUTTON1(鼠标左键)
//MouseEvent.BUTTON2(鼠标中间键)、MouseEvent.BUTTON3(鼠标右键)或MouseEvent.NOBUTTON(无鼠标键)
int getButton()
//返回事件发生时,鼠标按钮被点击的次数
int getClickCount()
5.ItemListener
对于对象下拉列表,单选按钮、复选按钮这些有选项的组件而言,我们的选项发生改变的时候,都会产生选项事件ItemEvent,如果需要处理这样的事件,就用到了ItemListenter,其原型如下:
public interface ItemListener
{
/*当选项的状态(选择或取消)发生改变时调用*/
public void itemStateChanged(ItemEvent ie);
}
6.WindowListener
操作窗口时会产生窗口事件WindowEvent,其对应监听器是WindowListener,原型如下:
public interface WindowListener {
/*窗口被激活时调用*/
public void windowActivated(WindowEvent we);
/*窗口被禁止时调用*/
public void windowDeactivated(WindowEvent we);
/*窗口被关闭时调用*/
public void windowClosed(WindowEvent we);
/*窗口正在关闭时调用*/
public void windowClosing(WindowEvent we);
/*窗口最小化时调用*/
public void windowIconified(WindowEvent we);
/*窗口恢复时调用*/
public void windowDeiconified(WindowEvent we);
/*窗口打开时调用*/
public void windowOpened(WindowEvent we);
}
7.FocusListener
某个组件得到/丢失焦点时将产生焦点事件FocusEvent,可以使用FocusListener来处理这样的事件,该接口的原型为:
public interface FocusListener
{
/*某个组件获得焦点时调用*/
public void focusGained(FocusEvent fe);
/*某个组件失去焦点时调用*/
public void focusLost(FocusEvent fe);
}
下面通过一个案例来深入体会事件监听,先来看看界面:
程序源码:
/**
* 鼠标移动和拖动事件
* @author Liao
*
*/
public class MouseMotionTest extends JFrame{
private JLabel jLabel1;
private JLabel jLabel2;
//在无参构造函数中初始化相关组件
public MouseMotionTest(){
jLabel1 = new JLabel("请移动鼠标");
jLabel2 = new JLabel("请拖动鼠标");
this.add(jLabel1,BorderLayout.NORTH);
this.add(jLabel2,BorderLayout.SOUTH);
//设置监听事件
this.addMouseMotionListener(new MyListener());
//设置窗体的基本信息
this.setTitle("鼠标移动和拖动测试");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private class MyListener implements MouseMotionListener{
//当鼠标拖动时调用此方法
public void mouseDragged(MouseEvent e) {
//得到鼠标位置的x坐标
int x = e.getX();
//得到鼠标的y坐标
int y = e.getY();
//将鼠标坐标信息显示到北边的标签中
String str = "正在拖动鼠标X:" + x + ";Y:" + y;
jLabel2.setText(str);
}
//鼠标移动时调用此方法
public void mouseMoved(MouseEvent e) {
//得到鼠标位置的x坐标
int x = e.getX();
//得到鼠标位置的y坐标
int y = e.getY();
//将鼠标坐标信息显示到北边的标签中
String str = "正在移动鼠标X:" + x + ";Y:" + y;
jLabel1.setText(str);
}
}
public static void main(String[] args) {
MouseMotionTest frame = new MouseMotionTest();
}
}
事件适配器
有时候,为了处理某个事件,要实现相应的事件监听接口,但是我们可能只对其中的某个方法感兴趣,但是又不得不将接口中的所有抽象方法进行重写。
java.awt.event包中提供了一系列适配器类,每个适配器类都将其对应的监听器接口中的所有抽象方法进行了空实现。
监听器接口和适配器的对应列表:
适配器的实质是为事件监听接口提供一种更加机动灵活的语法实现形式,方便我们有选择性、有针对性地实现感兴趣的方法,而不必将所有方法全部重写。
下面我们来修改上面的例子,改成只关注鼠标拖动事件,而不关注鼠标移动事件。
代码程序:
/**
* 鼠标移动和拖动事件
* @author Liao
*
*/
public class MouseMotionAdapterTest extends JFrame{
private JLabel jLabel1;
private JLabel jLabel2;
//在无参构造函数中初始化相关组件
public MouseMotionAdapterTest(){
jLabel1 = new JLabel("请移动鼠标");
jLabel2 = new JLabel("请拖动鼠标");
this.add(jLabel1,BorderLayout.NORTH);
this.add(jLabel2,BorderLayout.SOUTH);
//设置监听事件
this.addMouseMotionListener(new MyListener());
//设置窗体的基本信息
this.setTitle("鼠标移动和拖动测试");
this.setSize(400, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
/**
* 继承适配器之后,可以有选择性的实现对应的方法
* @author Liao
*
*/
private class MyListener extends MouseMotionAdapter{
//当鼠标拖动时调用此方法
public void mouseDragged(MouseEvent e) {
//得到鼠标位置的x坐标
int x = e.getX();
//得到鼠标的y坐标
int y = e.getY();
//将鼠标坐标信息显示到北边的标签中
String str = "正在拖动鼠标X:" + x + ";Y:" + y;
jLabel2.setText(str);
}
}
public static void main(String[] args) {
MouseMotionAdapterTest frame = new MouseMotionAdapterTest();
}
}
注:适配器是一个类,是继承而不是实现。另外对于只有一个实现方法的监听器,java并没有提供适配器(如:ActionListener),因为完全就没那个必要。