1. 事件驱动的核心概念
① 事件源(Event Source) :产生事件的组件,如 JButton
(按钮)、图片组件、JFrame
(窗体)等。
② 事件(Event):用户对组件的操作,如鼠标单击、鼠标划入 / 划出、键盘按键等。
③ 监听器(Listener):绑定在事件源上的 "响应器"。当事件源发生指定事件时,自动执行监听器中对应的代码逻辑。
2. 鼠标监听(MouseListener
)
用于监听鼠标在组件上的行为,需实现接口中所有抽象方法,响应不同鼠标操作。
抽象方法 | 触发场景 |
---|---|
mouseClicked(MouseEvent e) |
鼠标在组件上 ** 单击(按下并释放)** 时 |
mouseEntered(MouseEvent e) |
鼠标进入组件区域时 |
mouseExited(MouseEvent e) |
鼠标退出组件区域时 |
mousePressed(MouseEvent e) |
鼠标在组件上 ** 按下(未释放)** 时 |
mouseReleased(MouseEvent e) |
鼠标在组件上 ** 释放(按下后松开)** 时 |
3. KeyListener 键盘监听机制
KeyListener
是 Java Swing 中用于监听键盘事件的接口,需要实现以下 3 个方法,分别对应键盘操作的不同时刻:
Modifier and Type | 方法 | 描述 |
---|---|---|
void | keyPressed(KeyEvent e) | 按下键时调用。 |
void | keyReleased(KeyEvent e) | 当键已被释放时调用。 |
void | keyTyped(KeyEvent e) | 键入键时调用。 |
3. 关键逻辑 (1):
java
// 1. 给事件源 jtb 注册监听器(核心:告诉 jtb"被点击时执行监听器的逻辑")
jtb.addActionListener(
// 2. 创建匿名内部类对象(本质是 MyActionListener 接口的实现类对象)
new MyActionListener() {
// 3. 重写接口的抽象方法(事件触发后执行的核心逻辑)
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("不要点我啊!"); // 4. 具体业务逻辑
}
}
);
MyActionListener
:通常是java.awt.event.ActionListener
接口(或自定义的事件监听接口),该接口只有一个抽象方法actionPerformed(ActionEvent e)
,必须重写。ActionEvent e
:事件对象,可通过它获取事件信息(如e.getSource()
拿到触发事件的组件jtb
,e.getWhen()
拿到触发时间)。
4. 关键逻辑 (2):
java
jtb1.setBounds(0,0,100,50);
jtb1.setBounds(0,0,100,50);
① 作用 :给按钮 jtb1
设定 "位置和大小"。
② 参数含义: setBounds(x坐标, y坐标, 宽度, 高度)
x=0
:按钮左上角在窗口中的水平位置(窗口左上角为原点,向右为正方向)。y=0
:按钮左上角在窗口中的垂直位置(向下为正方向)。100
:按钮宽度为 100 像素。50
:按钮高度为 50 像素。
**③ 类比:**相当于在教室(窗口)里给一张桌子(按钮)划地盘 ------"放在左上角,宽 1 米,高 0.5 米"。
5. 关键逻辑 (3):
java
jtb1.addActionListener(this)
①
addActionListener是什么?
- 是
JButton
、JTextField
等 Swing 组件的成员方法 (继承自AbstractButton
等父类)。 - 方法的参数要求是一个**"实现了
ActionListener
接口的对象"**(因为只有这样的对象才具备处理事件的能力)。 - 作用:给组件 "绑定监听器",告诉组件:"当用户操作你时(比如点击按钮),就通知这个监听器对象,让它去执行
actionPerformed
方法"。
② actionPerformed
是什么?
- 它是
ActionListener
接口中 唯一的抽象方法,完整声明为:
java
void actionPerformed(ActionEvent e);
- 这个方法的作用是:定义 "动作事件发生时,具体要执行的逻辑"(比如按钮被点击后要放大、弹窗、跳转页面等)。
简单说:ActionListener
包含 actionPerformed
方法,实现 ActionListener
接口的类,必须重写 actionPerformed
方法------ 否则这个类就不符合 "处理动作事件" 的规则(普通类会直接编译报错)。
③ 结合之前的代码理解:
在 MyJFrame
类中:
java
public class MyJFrame extends JFrame implements ActionListener { // 实现接口
@Override
public void actionPerformed(ActionEvent e) { // 重写接口中的方法
// 按钮点击后的逻辑(比如放大按钮、移动按钮)
}
}
- 因为
MyJFrame
实现了ActionListener
接口,所以必须重写actionPerformed
方法(遵守规则)。 - 当按钮
jtb1
被点击时,会自动调用这个actionPerformed
方法(执行规则中约定的处理逻辑)。
④ 为什么this
能作为参数?
addActionListener(...)
方法的参数必须是一个 "实现了ActionListener
接口的对象",这是 Java 语法强制要求的。
在你的代码中:
java
public class MyJFrame extends JFrame implements ActionListener { ... }
MyJFrame
类声明了 implements ActionListener
(实现了监听器接口),并且重写了接口的 actionPerformed
方法(提供了事件处理逻辑)。 因此,MyJFrame
的对象(this
就是当前对象)完全符合 addActionListener
对参数的要求
6. 关键逻辑 (4):
java
JButton jtb1 = new JButton("点我啊"); //不理解
JButton jtb2 = new JButton("再点我啊"); //不理解
这句代码的核心是 "有参构造的使用": new JButton("点我啊")
真正的重点是调用了 JButton
的有参构造方法,作用是:在创建按钮对象时,直接设置按钮上显示的文本("点我啊")。
7. 关键逻辑 (5):
java
package Test;
public class test5 {
public static void main(String[] args) {
new MyJFrame3();
}
}
MyJFrame3
类中的 public MyJFrame3()
是无参构造方法(空参构造)------ 因为它的方法签名中没有任何参数。
6. 接口和继承实例化对象
(1) 继承的实例化场景
java
// 父类(普通类)可直接实例化
Animal a1 = new Animal("通用动物"); // 合法(父类非抽象)
a1.eat(); // 执行父类默认的 eat()
// 父类引用指向子类对象(多态)
Animal a2 = new Dog("旺财"); // 合法(Dog 是 Animal 的子类)
a2.shout(); // 执行子类重写的 shout()
// 子类引用指向子类对象(普通实例化)
Dog d = new Dog("来福"); // 合法
d.catchFrisbee(); // 执行子类独有方法
(2) 接口的实例化场景
java
// 接口不能直接实例化 → 报错
Movable m1 = new Movable();
// 接口引用指向实现类对象(唯一合法的多态写法)
Movable m2 = new Car(); // 合法(Car 实现了 Movable)
m2.move(); // 执行实现类重写的 move()
// 实现类引用指向实现类对象(普通实例化)
Car c = new Car(); // 合法
c.move(); // 执行实现类的 move()