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 小时前
Java技术八股学习Day36
学习
毕设源码-朱学姐4 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
四维碎片5 小时前
【Qt】UDP跨平台调试工具
qt·学习·udp
好奇龙猫5 小时前
【人工智能学习-AI入试相关题目练习-第十八次】
人工智能·学习
C雨后彩虹6 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
程序员辣条6 小时前
AI产品经理:2024年职场发展的新机遇
人工智能·学习·职场和发展·产品经理·大模型学习·大模型入门·大模型教程
wanping158259923416 小时前
AI Agent(学习六-FAISS 持久化到磁盘(重启不丢记忆))
人工智能·学习·faiss
童话名剑6 小时前
序列模型与集束搜索(吴恩达深度学习笔记)
人工智能·笔记·深度学习·机器翻译·seq2seq·集束搜索·编码-解码模型
知识分享小能手6 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
java1234_小锋7 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试