当前位置: 首页 > java >正文

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方法描述
voidkeyPressed(KeyEvent e)按下键时调用。
voidkeyReleased(KeyEvent e)当键已被释放时调用。
voidkeyTyped(KeyEvent e)键入键时调用。

3. 关键逻辑 (1):

// 1. 给事件源 jtb 注册监听器(核心:告诉 jtb“被点击时执行监听器的逻辑”)
jtb.addActionListener(// 2. 创建匿名内部类对象(本质是 MyActionListener 接口的实现类对象)new MyActionListener() {  // 3. 重写接口的抽象方法(事件触发后执行的核心逻辑)@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("不要点我啊!"); // 4. 具体业务逻辑}}
);
  • MyActionListener:通常是 java.awt.event.ActionListener 接口(或自定义的事件监听接口),该接口只有一个抽象方法 actionPerformed(ActionEvent e),必须重写。
  • ActionEvent e:事件对象,可通过它获取事件信息(如 e.getSource() 拿到触发事件的组件 jtbe.getWhen() 拿到触发时间)。

4. 关键逻辑 (2):

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):

jtb1.addActionListener(this)

addActionListener 是什么?

  • 是 JButtonJTextField 等 Swing 组件的成员方法(继承自 AbstractButton 等父类)。
  • 方法的参数要求是一个 “实现了 ActionListener 接口的对象”(因为只有这样的对象才具备处理事件的能力)。
  • 作用:给组件 “绑定监听器”,告诉组件:“当用户操作你时(比如点击按钮),就通知这个监听器对象,让它去执行 actionPerformed 方法”。

② actionPerformed 是什么?

  • 它是 ActionListener 接口中 唯一的抽象方法,完整声明为:
void actionPerformed(ActionEvent e);
  • 这个方法的作用是:定义 “动作事件发生时,具体要执行的逻辑”(比如按钮被点击后要放大、弹窗、跳转页面等)。

简单说:ActionListener 包含 actionPerformed 方法,实现 ActionListener 接口的类,必须重写 actionPerformed 方法—— 否则这个类就不符合 “处理动作事件” 的规则(普通类会直接编译报错)。

③ 结合之前的代码理解:

在 MyJFrame 类中:

public class MyJFrame extends JFrame implements ActionListener {  // 实现接口@Overridepublic void actionPerformed(ActionEvent e) {  // 重写接口中的方法// 按钮点击后的逻辑(比如放大按钮、移动按钮)}
}
  • 因为 MyJFrame 实现了 ActionListener 接口,所以必须重写 actionPerformed 方法(遵守规则)。
  • 当按钮 jtb1 被点击时,会自动调用这个 actionPerformed 方法(执行规则中约定的处理逻辑)。

④ 为什么this能作为参数?

addActionListener(...) 方法的参数必须是一个 “实现了ActionListener接口的对象”,这是 Java 语法强制要求的。

在你的代码中:

public class MyJFrame extends JFrame implements ActionListener { ... }

MyJFrame 类声明了 implements ActionListener(实现了监听器接口),并且重写了接口的 actionPerformed 方法(提供了事件处理逻辑)。因此,MyJFrame 的对象(this 就是当前对象)完全符合 addActionListener 对参数的要求

6. 关键逻辑 (4):

    JButton jtb1 = new JButton("点我啊");  //不理解JButton jtb2 = new JButton("再点我啊");  //不理解

这句代码的核心是 “有参构造的使用”:new JButton("点我啊") 真正的重点是调用了 JButton 的有参构造方法,作用是:在创建按钮对象时,直接设置按钮上显示的文本(“点我啊”)。

7. 关键逻辑 (5):

package Test;public class test5 {public static void main(String[] args) {new MyJFrame3();}
}

MyJFrame3 类中的 public MyJFrame3() 是无参构造方法(空参构造)—— 因为它的方法签名中没有任何参数。

6. 接口和继承实例化对象

(1) 继承的实例化场景
// 父类(普通类)可直接实例化
Animal a1 = new Animal("通用动物"); // 合法(父类非抽象)
a1.eat(); // 执行父类默认的 eat()// 父类引用指向子类对象(多态)
Animal a2 = new Dog("旺财"); // 合法(Dog 是 Animal 的子类)
a2.shout(); // 执行子类重写的 shout()// 子类引用指向子类对象(普通实例化)
Dog d = new Dog("来福"); // 合法
d.catchFrisbee(); // 执行子类独有方法

(2) 接口的实例化场景

// 接口不能直接实例化 → 报错
Movable m1 = new Movable(); // 接口引用指向实现类对象(唯一合法的多态写法)
Movable m2 = new Car(); // 合法(Car 实现了 Movable)
m2.move(); // 执行实现类重写的 move()// 实现类引用指向实现类对象(普通实例化)
Car c = new Car(); // 合法
c.move(); // 执行实现类的 move()
http://www.xdnf.cn/news/20148.html

相关文章:

  • 《Cocos Creator的2D、3D渲染使用记录》
  • 使用自定义固定公网URL地址远程访问公司内网OA办公系统,本地无需公网IP和专线让外网访问
  • 【Python基础】 19 Rust 与 Python if 语句对比笔记
  • Unity学习----【进阶】Addressables(二)--加载资源与打包及更新
  • Github | MoneyPrinterTurbo:自动化视频内容生成系统
  • 医疗AI中GPU集群设计与交付实践
  • Windows蓝屏解决方案(扩展)
  • C++进阶——继承 (1)
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • Cursor Pair Programming:在前端项目里用 AI 快速迭代 UI 组件
  • STM32使用HAL库驱动铁电存储FM25CL64
  • 用 Shields.io 定制 README 个性徽章
  • 嵌入式铁头山羊stm32-SAR型ADC模块介绍、采样时间、转换时间-Day24
  • Web与Nginx
  • MCP 和 Fuction Call 有什么不同
  • Python基础(①④内存管理机制)
  • 【Element Plus 表单组件样式统一 CSS 文字特效实现指南】
  • 啥是两化融合?
  • 算法模板(Java版)_哈希表
  • 手写Java泛型,彻底掌握它!
  • 结合prompt分析NodeRAG的build过程
  • MySQL事务的四大特性(ACID)
  • 代码随想录二刷之“贪心算法”~GO
  • HTML 基本结构
  • 一篇文章带你彻底搞懂 JVM 垃圾收集器
  • 大数据开发计划表(实际版)
  • Python入门教程之数学运算符
  • 基于单片机智能水龙头/智能洗漱台设计
  • STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践
  • 8051单片机-成为点灯大师