Java 学习笔记(进阶篇2)

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() 拿到触发事件的组件 jtbe.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是什么?

  • JButtonJTextField 等 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()
相关推荐
程序猿炎义3 小时前
【NVIDIA AIQ】自定义函数实践
人工智能·python·学习
上官浩仁3 小时前
springboot ioc 控制反转入门与实战
java·spring boot·spring
小陈phd3 小时前
高级RAG策略学习(四)——上下文窗口增强检索RAG
人工智能·学习·langchain
叫我阿柒啊3 小时前
从Java全栈到前端框架:一位程序员的实战之路
java·spring boot·微服务·消息队列·vue3·前端开发·后端开发
mqiqe4 小时前
架构-亿级流量性能调优实践
java·架构
野犬寒鸦4 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
七夜zippoe4 小时前
AI+Java 守护你的钱袋子!金融领域的智能风控与极速交易
java·人工智能·金融
Jayyih5 小时前
嵌入式系统学习DAY28(网络编程)
网络·学习·tcp/ip
Suckerbin5 小时前
DarkHole: 2靶场渗透
笔记·安全·web安全·网络安全