Java Swing事件监听器详解(附带实例)
Swing 提供了很多组件,这些组件本身并不带有任何功能。例如,在窗体中定义一个按钮,当用户单击该按钮时,虽然按钮可以凹凸显示,但在窗体中并没有实现任何功能。这时需要为按钮添加特定的事件监听器,该监听器负责处理用户单击按钮后实现的功能。
本节将着重讲解 Swing 中常用的 3 种事件监听器,即动作事件监听器、键盘事件监听器、鼠标事件监听器。
下表描述了动作事件监听器的接口与事件源等。
下面以单击按钮事件为例来说明动作事件监听器,当用户单击按钮时,将触发动作事件。
【实例 1】单击按钮后,修改按钮文本。创建 SimpleEvent 类,使该类继承 JFrame 类,在类中创建按钮组件,为按钮组件添加动作监听器,然后将按钮组件添加到窗体中。

图 1 按钮添加动作事件后的点击效果
在本实例中,为按钮设置了动作监听器。由于获取事件监听时需要获取实现 ActionListener 接口的对象,因此定义了一个内部类 jbAction 实现 ActionListener 接口,同时在该内部类中实现了 actionPerformed() 方法,也就是在 actionPerformed() 方法中定义当用户单击该按钮后实现怎样的功能。
KeyListener 接口共有 3 个抽象方法,分别在发生按键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发,具体如下:
在 KeyEvent 类中,以“VK_”开头的静态常量代表各个按键的 keyCode,可以通过这些静态常量判断事件中的按键,获得按键的标签。
【实例 2】通过键盘事件模拟一个虚拟键盘。首先需要自定义一个 addButtons() 方法,用来将所有的按键添加到一个 ArrayList 集合中,然后添加一个 JTextField 组件,并为该组件添加 addKeyListener 事件监听,在该事件监听中重写 keyPressed() 和 keyReleased() 方法,分别用来在按下和释放键时执行相应的操作。关键代码如下:

图 2 键盘事件
MouseListener 接口共有 5 个抽象方法,分别在光标移入或移出组件、鼠标按键被按下或被释放和发生单击事件时被触发。所谓单击事件,就是按键被按下并被释放。需要注意的是,如果按键是在移出组件之后才被释放的,则不会触发单击事件。
MouseListener 接口的具体定义如下:
当需要判断触发此次事件的按键时,可以通过下表中的静态常量判断由 getButton() 方法返回的 int 型值代表的键:
【实例 3】捕捉鼠标在窗体中的行为。创建一个窗体,在窗体中捕捉鼠标进入、移出和单击事件,关键代码如下:

图 3 程序弹出的窗体
首先将光标移入窗体,然后单击,接着双击,最后将光标移出窗体,在控制台中将得到如下图所示的信息。当双击鼠标时,第一次单击鼠标将触发一次单击事件。

图 4 在控制台中输出的日志
本节将着重讲解 Swing 中常用的 3 种事件监听器,即动作事件监听器、键盘事件监听器、鼠标事件监听器。
Swing ActionEvent动作事件
动作事件(ActionEvent)监听器是 Swing 中比较常用的事件监听器,很多组件的动作都会使用它进行监听,如按钮被单击等。下表描述了动作事件监听器的接口与事件源等。
| 相关定义 | 实现方式 | 相关定义 | 实现方式 |
|---|---|---|---|
| 事件名 | ActionEvent | 添加监听方法 | addActionListener() |
| 事件源 | JButton、JList、JTextField 等组件 | 删除监听方法 | removeActionListener() |
| 监听接口 | ActionListener |
下面以单击按钮事件为例来说明动作事件监听器,当用户单击按钮时,将触发动作事件。
【实例 1】单击按钮后,修改按钮文本。创建 SimpleEvent 类,使该类继承 JFrame 类,在类中创建按钮组件,为按钮组件添加动作监听器,然后将按钮组件添加到窗体中。
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class SimpleEvent extends JFrame {
private JButton jb = new JButton("我是假按钮,点击我");
public SimpleEvent() {
setLayout(null);
setSize(200, 100);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Container cp = getContentPane();
cp.add(jb);
jb.setBounds(10, 10, 150, 30);
jb.addActionListener(new jbAction());
setVisible(true);
}
class jbAction implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
jb.setText("我被点击了");
}
}
public static void main(String[] args) {
new SimpleEvent();
}
}
运行结果如下图所示:
图 1 按钮添加动作事件后的点击效果
在本实例中,为按钮设置了动作监听器。由于获取事件监听时需要获取实现 ActionListener 接口的对象,因此定义了一个内部类 jbAction 实现 ActionListener 接口,同时在该内部类中实现了 actionPerformed() 方法,也就是在 actionPerformed() 方法中定义当用户单击该按钮后实现怎样的功能。
Swing KeyEvent键盘事件
当向文本框中输入内容时,将发生键盘事件。KeyEvent 类负责捕获键盘事件,可以通过为组件添加实现了 KeyListener 接口的监听器类来处理相应的键盘事件。KeyListener 接口共有 3 个抽象方法,分别在发生按键事件(按下并释放键)、按键被按下(手指按下键但不松开)和按键被释放(手指从按下的键上松开)时被触发,具体如下:
public interface KeyListener extends EventListener {
public void keyTyped(KeyEvent e); // 发生按键事件被触发
public void keyPressed(KeyEvent e); // 按键按下事件被触发
public void keyReleased(KeyEvent e); // 按键释放事件被触发
}
在上述每个抽象方法中,均传入了 KeyEvent 类的对象。KeyEvent 类中比较常用的方法如下表所示:| 方法 | 功能简介 |
|---|---|
| getSource() | 用来获得触发此次事件的组件对象,返回值为 Object 类型 |
| getKeyChar() | 用来获得与此次事件中的键相关联的字符 |
| getKeyCode() | 用来获得与此次事件中的键相关联的整数 keyCode |
| getKeyText(int keyCode) | 用来获得描述 keyCode 的标签,如 A、F1 和 HOME 等 |
| isActionKey() | 用来查看此次事件中的键是否为“动作”键 |
| isControlDown() | 用来查看 Ctrl 键在此次事件中是否被按下,当返回 true 时表示被按下 |
| isAltDown() | 用来查看 Alt 键在此次事件中是否被按下,当返回 true 时表示被按下 |
| isShiftDown() | 用来查看 Shift 键在此次事件中是否被按下,返回 true 时表示被按下 |
在 KeyEvent 类中,以“VK_”开头的静态常量代表各个按键的 keyCode,可以通过这些静态常量判断事件中的按键,获得按键的标签。
【实例 2】通过键盘事件模拟一个虚拟键盘。首先需要自定义一个 addButtons() 方法,用来将所有的按键添加到一个 ArrayList 集合中,然后添加一个 JTextField 组件,并为该组件添加 addKeyListener 事件监听,在该事件监听中重写 keyPressed() 和 keyReleased() 方法,分别用来在按下和释放键时执行相应的操作。关键代码如下:
Color green = Color.GREEN; // 定义 Color 对象,用来表示按下键的颜色
Color white = Color.WHITE; // 定义 Color 对象,用来表示释放键的颜色
ArrayList<JButton> btns = new ArrayList<JButton>(); // 定义一个集合,用来存储所有的按键 ID
// 自定义一个方法,用来将容器中的所有 JButton 组件添加到集合中
private void addButtons() {
for (Component cmp : contentPane.getComponents()) { // 遍历面板中的所有组件
if (cmp instanceof JButton) { // 判断组件的类型是否为 JButton 类型
btns.add((JButton) cmp); // 将 JButton 组件添加到集合中
}
}
}
public KeyBoard() { // KeyBoard 的构造方法
...
textField = new JTextField(); // 创建文本框组件
textField.addKeyListener(new KeyAdapter() { // 为文本框添加键盘事件的监听
char word; // 用于记录按下的字符
public void keyPressed(KeyEvent e) { // 按键按下时被触发
word = e.getKeyChar(); // 获取按下键表示的字符
for (int i = 0; i < btns.size(); i++) { // 遍历存储按键 ID 的 ArrayList 集合
// 判断按键是否与遍历到的按键的文本相同
if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
btns.get(i).setBackground(green); // 将指定按键颜色设置为绿色
}
}
}
public void keyReleased(KeyEvent e) { // 按键释放时被触发
word = e.getKeyChar(); // 获取释放键表示的字符
for (int i = 0; i < btns.size(); i++) { // 遍历存储按键 ID 的 ArrayList 集合
// 判断按键是否与遍历到的按键的文本相同
if (String.valueOf(word).equalsIgnoreCase(btns.get(i).getText())) {
btns.get(i).setBackground(white); // 将指定按键颜色设置为白色
}
}
}
});
panel.add(textField, BorderLayout.CENTER); // 将文本框添加到中部区域
textField.setColumns(10); // 设置文本框列数
}
运行本实例,将鼠标定位到文本框组件中,然后按下键盘上的按键,窗体中的相应按钮会变为绿色,释放按键时,相应按钮变为白色,效果如下图所示:
图 2 键盘事件
Swing MouseEvent鼠标事件
所有组件都能发生鼠标事件,MouseEvent 类负责捕获鼠标事件,可以通过为组件添加实现了 MouseListener 接口的监听器类来处理相应的鼠标事件。MouseListener 接口共有 5 个抽象方法,分别在光标移入或移出组件、鼠标按键被按下或被释放和发生单击事件时被触发。所谓单击事件,就是按键被按下并被释放。需要注意的是,如果按键是在移出组件之后才被释放的,则不会触发单击事件。
MouseListener 接口的具体定义如下:
public interface MouseListener extends EventListener {
public void mouseEntered(MouseEvent e); // 光标移入组件时被触发
public void mousePressed(MouseEvent e); // 鼠标按键被按下时被触发
public void mouseReleased(MouseEvent e); // 鼠标按键被释放时被触发
public void mouseClicked(MouseEvent e); // 发生单击事件时被触发
public void mouseExited(MouseEvent e); // 光标移出组件时被触发
}
在上述每个抽象方法中,均传入了 MouseEvent 类的对象。MouseEvent 类中比较常用的方法如下表所示:| 方法 | 功能简介 |
|---|---|
| getSource() | 用来获得触发此事件的组件对象,返回值为 Object 类型 |
| getButton() | 用来获得代表此次按下、释放或单击的按键的 int 型值 |
| getClickCount() | 用来获得单击按钮的次数 |
当需要判断触发此次事件的按键时,可以通过下表中的静态常量判断由 getButton() 方法返回的 int 型值代表的键:
| 静态常量 | 常量值 | 代表的键 |
|---|---|---|
| BUTTON1 | 1 | 代表鼠标左键 |
| BUTTON2 | 2 | 代表鼠标滚轮 |
| BUTTON3 | 3 | 代表鼠标右键 |
【实例 3】捕捉鼠标在窗体中的行为。创建一个窗体,在窗体中捕捉鼠标进入、移出和单击事件,关键代码如下:
private void mouseOper(MouseEvent e) { // 通过该值可以判断按下的是哪个键
int i = e.getButton();
if (i == MouseEvent.BUTTON1)
System.out.println("按下的是鼠标左键");
else if (i == MouseEvent.BUTTON2)
System.out.println("按下的是鼠标滚轮");
else if (i == MouseEvent.BUTTON3)
System.out.println("按下的是鼠标右键");
}
public MouseEvent_Example() {
// 省略部分代码
final JLabel label = new JLabel(); // 创建标签对象
label.addMouseListener(new MouseListener() {
public void mouseEntered(MouseEvent e) { // 光标移入组件时被触发
System.out.println("光标移入组件");
}
public void mousePressed(MouseEvent e) { // 鼠标按键被按下时被触发
System.out.print("鼠标按键被按下,");
mouseOper(e);
}
public void mouseReleased(MouseEvent e) { // 鼠标按键被释放时被触发
System.out.print("鼠标按键被释放,");
mouseOper(e);
}
public void mouseClicked(MouseEvent e) { // 发生单击事件时被触发
System.out.print("单击了鼠标按键,");
mouseOper(e);
int clickCount = e.getClickCount(); // 获取鼠标单击次数
System.out.println("单击次数为" + clickCount + "下");
}
public void mouseExited(MouseEvent e) { // 光标移出组件时被触发
System.out.println("光标移出组件");
}
});
// 省略部分代码
}
运行结果如下图所示:
图 3 程序弹出的窗体
首先将光标移入窗体,然后单击,接着双击,最后将光标移出窗体,在控制台中将得到如下图所示的信息。当双击鼠标时,第一次单击鼠标将触发一次单击事件。

图 4 在控制台中输出的日志
相关文章
- Java Swing.JFrame的用法(附带实例)
- Java Swing JDialog对话框的用法(附带实例)
- Java Swing JOptionPane对话框用法详解(附带实例)
- Java Swing FlowLayout布局管理器的用法(附带实例)
- Java Swing BorderLayout布局管理器的用法(附带实例)
- Java Swing JPanel和JScrollPane面板的用法(附带实例)
- Java Swing JLabel标签的用法(附带实例)
- Java Swing ImageIcon图标类的用法(附带实例)
- Java Swing JButton按钮的用法(附带实例)
- Java Swing JRadioButton单选按钮的用法(附带实例)
ICP备案:
公安联网备案: