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()
相关推荐
JanelSirry几秒前
VMware+RockyLinux+ikuai+docker+cri-docker+k8s+calico BGP网络 自用 实践笔记(二)
笔记·docker·kubernetes
喂完待续10 分钟前
【序列晋升】45 Spring Data Elasticsearch 实战:3 个核心方案破解索引管理与复杂查询痛点,告别低效开发
java·后端·spring·big data·spring data·序列晋升
郑重其事,鹏程万里13 分钟前
commons-exec
java
龙茶清欢14 分钟前
具有实际开发参考意义的 MyBatis-Plus BaseEntity 基类示例
java·spring boot·spring cloud·mybatis
神龙斗士24017 分钟前
Java 数组的定义与使用
java·开发语言·数据结构·算法
计算机学姐18 分钟前
基于微信小程序的扶贫助农系统【2026最新】
java·vue.js·spring boot·mysql·微信小程序·小程序·mybatis
白露与泡影18 分钟前
2025互联网大厂高频Java面试真题解析
java·开发语言·面试
forever銳19 分钟前
java中如何保证接口幂等性
java·后端
柯南二号21 分钟前
【Java后端】MyBatis 和 MyBatis-Plus (MP) 的区别
java·数据库·tomcat
C++chaofan24 分钟前
游标查询在对话历史场景下的独特优势
java·前端·javascript·数据库·spring boot