Java AWT鼠标事件全解析

要执行这些 Java AWT 程序,你需要将它们分别保存为独立的 .java 文件,并使用 javacjava 命令进行编译和运行。以下是每个程序的执行步骤和功能说明。

1.程序清单 1: MouseEventsDemo.java

此程序演示了鼠标事件处理,包括点击、进入、退出、按下、释放、拖动和移动事件。

java 复制代码
// 保存为 MouseEventsDemo.java
import java.awt.*;
import java.awt.event.*;

public class MouseEventsDemo extends Frame implements MouseListener, MouseMotionListener {

  String msg = "";
  int mouseX = 0, mouseY = 0; // 鼠标坐标 public MouseEventsDemo() {
     addMouseListener(this);
     addMouseMotionListener(this);
     addWindowListener(new MyWindowAdapter());
  }

  // 处理鼠标点击事件
  public void mouseClicked(MouseEvent me) {
    msg = msg + " -- click received";
    repaint();
  }

  // 处理鼠标进入组件区域事件 public void mouseEntered(MouseEvent me) {
    mouseX = 100;
    mouseY = 100;
    msg = "Mouse entered.";
    repaint();
  }

  // 处理鼠标离开组件区域事件
  public void mouseExited(MouseEvent me) {
    mouseX = 100;
    mouseY = 100;
    msg = "Mouse exited.";
    repaint();
  }

  // 处理鼠标按键按下事件
  public void mousePressed(MouseEvent me) {
    // 保存坐标 mouseX = me.getX();
    mouseY = me.getY();
    msg = "Button down";
    repaint();
  }

  // 处理鼠标按键释放事件 public void mouseReleased(MouseEvent me) {
    // 保存坐标
    mouseX = me.getX();
    mouseY = me.getY();
    msg = "Button Released";
    repaint();
  }

  // 处理鼠标拖动事件 public void mouseDragged(MouseEvent me) {
    // 保存坐标 mouseX = me.getX();
    mouseY = me.getY();
    msg = "*" + " mouse at " + mouseX + ", " + mouseY;
    repaint();
  }

  // 处理鼠标移动事件 public void mouseMoved(MouseEvent me) {
    msg = "Moving mouse at " + me.getX() + ", " + me.getY();
    repaint();
  }

  // 在窗口的当前 X,Y 位置显示消息
  public void paint(Graphics g) {
    g.drawString(msg, mouseX, mouseY);
  }

  public static void main(String[] args) {
    MouseEventsDemo appwin = new MouseEventsDemo();

    appwin.setSize(new Dimension(300, 300));
    appwin.setTitle("MouseEventDemo");
    appwin.setVisible(true);
  }
}

// 当点击框架中的关闭框时,关闭窗口并退出程序。
class MyWindowAdapter extends WindowAdapter {
  public void windowClosing(WindowEvent we) {
    System.exit(0);
  }
}

执行命令:

bash 复制代码
javac MouseEventsDemo.java
java MouseEventsDemo

2. 程序清单 2: SimpleKey.java

此程序演示了基本的键盘事件处理,包括按键按下、释放和键入事件。

java 复制代码
// 保存为 SimpleKey.java
import java.awt.*;
import java.awt.event.*;

public class SimpleKey extends Frame implements KeyListener {

  String msg = "";
  String keyState = "";

  public SimpleKey() {
    addKeyListener(this);
    addWindowListener(new MyWindowAdapter());
  }

  // 处理按键按下事件 public void keyPressed(KeyEvent ke) {
    keyState = "Key Down";
    repaint();
  }

  // 处理按键释放事件
  public void keyReleased(KeyEvent ke) {
    keyState = "Key Up";
    repaint();
  }

  // 处理键入字符事件 public void keyTyped(KeyEvent ke) {
    msg += ke.getKeyChar();
    repaint();
  }

  // 显示按键信息
  public void paint(Graphics g) {
    g.drawString(msg, 20, 100);
    g.drawString(keyState, 20, 50);
  }

  public static void main(String[] args) {
    SimpleKey appwin = new SimpleKey();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("SimpleKey");
    appwin.setVisible(true);
  }
}

// 当点击框架中的关闭框时,关闭窗口并退出程序。
class MyWindowAdapter extends WindowAdapter {
  public void windowClosing(WindowEvent we) {
    System.exit(0);
  }
}

执行命令:

bash 复制代码
javac SimpleKey.java
java SimpleKey

3. 程序清单 3: KeyEventsDemo.java

此程序演示了如何识别特定的虚拟键码(如功能键、方向键、翻页键)。

java 复制代码
// 保存为 KeyEventsDemo.java
import java.awt.*;
import java.awt.event.*;

public class KeyEventsDemo extends Frame
  implements KeyListener {

  String msg = "";
  String keyState = "";

  public KeyEventsDemo() {
    addKeyListener(this);
    addWindowListener(new MyWindowAdapter());
  }

  // 处理按键按下事件 public void keyPressed(KeyEvent ke) {
    keyState = "Key Down";

    int key = ke.getKeyCode();
    switch(key) {
      case KeyEvent.VK_F1:
        msg += "<F1>";
        break;
      case KeyEvent.VK_F2:
        msg += "<F2>";
        break;
      case KeyEvent.VK_F3:
        msg += "<F3>";
        break;
      case KeyEvent.VK_PAGE_DOWN:
        msg += "<PgDn>";
        break;
      case KeyEvent.VK_PAGE_UP:
        msg += "<PgUp>";
        break;
      case KeyEvent.VK_LEFT:
        msg += "<Left Arrow>";
        break;
      case KeyEvent.VK_RIGHT:
        msg += "<Right Arrow>";
        break;
    }

    repaint();
  }

  // 处理按键释放事件 public void keyReleased(KeyEvent ke) {
    keyState = "Key Up";
    repaint();
  }

  // 处理键入字符事件
  public void keyTyped(KeyEvent ke) {
    msg += ke.getKeyChar();
    repaint();
  }

  // 显示按键信息 public void paint(Graphics g) {
    g.drawString(msg, 20, 100);
    g.drawString(keyState, 20, 50);
  }

  public static void main(String[] args) {
    KeyEventsDemo appwin = new KeyEventsDemo();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("KeyEventsDemo");
    appwin.setVisible(true);
  }
}

// 当点击框架中的关闭框时,关闭窗口并退出程序。
class MyWindowAdapter extends WindowAdapter {
  public void windowClosing(WindowEvent we) {
    System.exit(0);
  }
}

执行命令:

bash 复制代码
javac KeyEventsDemo.java
java KeyEventsDemo

4. 程序清单 4: AdapterDemo.java

此程序演示了使用适配器类(MouseAdapter)来处理鼠标事件,避免了实现接口中所有方法的繁琐。

java 复制代码
// 保存为 AdapterDemo.java
import java.awt.*;
import java.awt.event.*;

public class AdapterDemo extends Frame {
  String msg = "";

  public AdapterDemo() {
     addMouseListener(new MyMouseAdapter(this));
     addMouseMotionListener(new MyMouseAdapter(this));
     addWindowListener(new MyWindowAdapter());
  }

  // 显示鼠标信息 public void paint(Graphics g) {
    g.drawString(msg, 20, 80);
  }

  public static void main(String[] args) {
    AdapterDemo appwin = new AdapterDemo();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("AdapterDemo");
    appwin.setVisible(true);
  }
}

// 仅处理鼠标点击和拖动事件
class MyMouseAdapter extends MouseAdapter {
  AdapterDemo adapterDemo;

  public MyMouseAdapter(AdapterDemo adapterDemo) {
    this.adapterDemo = adapterDemo;
  }

  // 处理鼠标点击事件
  public void mouseClicked(MouseEvent me) {
    adapterDemo.msg = "Mouse clicked";
    adapterDemo.repaint();
  }

  // 处理鼠标拖动事件
  public void mouseDragged(MouseEvent me) {
    adapterDemo.msg = "Mouse dragged";
    adapterDemo.repaint();
  }
}

// 当点击框架中的关闭框时,关闭窗口并退出程序。
class MyWindowAdapter extends WindowAdapter {
  public void windowClosing(WindowEvent we) {
    System.exit(0);
  }
}

执行命令:

bash 复制代码
javac AdapterDemo.java
java AdapterDemo

5. 程序清单 5: MousePressedDemo.java

此程序演示了使用外部适配器类处理鼠标按下事件。

java 复制代码
// 保存为 MousePressedDemo.java
import java.awt.*;
import java.awt.event.*;

public class MousePressedDemo extends Frame {
  String msg = "";

  public MousePressedDemo() {
    addMouseListener(new MyMouseAdapter(this));
    addWindowListener(new MyWindowAdapter());
  }

  public void paint(Graphics g) {
    g.drawString(msg, 20, 100);
  }

  public static void main(String[] args) {
    MousePressedDemo appwin = new MousePressedDemo();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("MousePressedDemo");
    appwin.setVisible(true);
  }
}

class MyMouseAdapter extends MouseAdapter {
  MousePressedDemo mousePressedDemo;

  public MyMouseAdapter(MousePressedDemo mousePressedDemo) {
    this.mousePressedDemo = mousePressedDemo;
  }

  // 处理鼠标按下事件 public void mousePressed(MouseEvent me) {
    mousePressedDemo.msg = "Mouse Pressed.";
    mousePressedDemo.repaint();
  }
}

// 当点击框架中的关闭框时,关闭窗口并退出程序。
class MyWindowAdapter extends WindowAdapter {
  public void windowClosing(WindowEvent we) {
    System.exit(0);
  }
}

执行命令:

bash 复制代码
javac MousePressedDemo.java
java MousePressedDemo

6. 程序清单 6: InnerClassDemo.java

此程序演示了使用内部类来处理事件,使代码结构更紧凑。

java 复制代码
// 保存为 InnerClassDemo.java
import java.awt.*;
import java.awt.event.*;

public class InnerClassDemo extends Frame {
  String msg = "";

  public InnerClassDemo() {
    addMouseListener(new MyMouseAdapter());
    addWindowListener(new MyWindowAdapter());
  }

  // 内部类处理鼠标按下事件
  class MyMouseAdapter extends MouseAdapter {
    public void mousePressed(MouseEvent me) {
      msg = "Mouse Pressed.";
      repaint();
    }
  }

  // 内部类处理窗口关闭事件
  class MyWindowAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent we) {
      System.exit(0);
    }
  }

  public void paint(Graphics g) {
    g.drawString(msg, 20, 80);
  }

  public static void main(String[] args) {
    InnerClassDemo appwin = new InnerClassDemo();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("InnerClassDemo");
    appwin.setVisible(true);
  }
}

执行命令:

bash 复制代码
javac InnerClassDemo.java
java InnerClassDemo

7. 程序清单 7: AnonymousInnerClassDemo.java

此程序演示了使用匿名内部类来处理事件,这是最简洁的事件处理方式。

java 复制代码
// 保存为 AnonymousInnerClassDemo.java
import java.awt.*;
import java.awt.event.*;

public class AnonymousInnerClassDemo extends Frame {
  String msg = "";

  public AnonymousInnerClassDemo() {

    // 匿名内部类处理鼠标按下事件
    addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent me) {
        msg = "Mouse Pressed.";
        repaint();
      }
    });

 // 匿名内部类处理窗口关闭事件
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent we) {
        System.exit(0);
      }
    });
  }

  public void paint(Graphics g) {
    g.drawString(msg, 20, 80);
  }

  public static void main(String[] args) {
    AnonymousInnerClassDemo appwin =
                  new AnonymousInnerClassDemo();

    appwin.setSize(new Dimension(200, 150));
    appwin.setTitle("AnonymousInnerClassDemo");
    appwin.setVisible(true);
  }
}

执行命令:

bash 复制代码
javac AnonymousInnerClassDemo.java
java AnonymousInnerClassDemo

程序功能与事件处理机制总结

程序文件 核心演示内容 事件处理方式 关键接口/类
MouseEventsDemo 鼠标所有事件(点击、移动、拖动等) 主类实现 MouseListenerMouseMotionListener 接口 MouseListener, MouseMotionListener
SimpleKey 键盘基本事件(按下、释放、键入) 主类实现 KeyListener 接口 KeyListener
KeyEventsDemo 识别特定虚拟键码(如F1, 方向键) 主类实现 KeyListener 接口,使用 getKeyCode() KeyListener, KeyEvent.VK_*
AdapterDemo 使用适配器类处理鼠标事件 使用外部 MouseAdapter MouseAdapter
MousePressedDemo 使用外部适配器类处理单一事件 使用外部 MouseAdapter MouseAdapter
InnerClassDemo 使用内部类处理事件 使用成员内部类 内部类
AnonymousInnerClassDemo 使用匿名内部类处理事件 使用匿名内部类 匿名内部类

通用执行步骤:

  1. 保存文件 :将每个 listing 的代码复制到对应的 .java 文件中(例如 MouseEventsDemo.java)。
  2. 编译 :在命令行中,导航到文件所在目录,运行 javac 文件名.java
  3. 运行 :编译成功后,运行 java 类名(注意:类名不含 .java 后缀)。

注意事项:

  • 这些是基于 AWT 的旧式 Java GUI 程序。运行前请确保已安装 Java开发工具包 (JDK)。
  • 程序窗口的关闭功能均通过 WindowAdapter 实现,点击窗口关闭按钮可退出程序 。
  • 所有程序都遵循 AWT 的事件处理模型:事件源 (如 Frame)注册事件监听器 (如 MouseListener),当事件发生时,会调用监听器对应的回调方法(如 mouseClicked)。

参考来源

相关推荐
tuanxiang1 小时前
中英文AI检测的跨语系误判问题排查与修复
人工智能
冬奇Lab1 小时前
开源项目第178期:OptMem — 426 个 token 的提示词,给 AI Agent 跨会话的持久记忆
人工智能·开源·资讯
冬奇Lab1 小时前
代码库知识库系列(09):用 codebase-memory-mcp 实战——在 LightRAG 上跑三路召回
人工智能
科技圈观察2 小时前
选哪家服务商做跨境业务KYC数字身份认证和合规支持?2026出海选型参考
大数据·人工智能
手写码匠2 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
舒一笑2 小时前
Windows + WSL2 完整复现 Avernet WAIC 6 Bot 协作演示
人工智能·git·开源
犀利豆3 小时前
我和 Claude Code 一起写了一本介绍 Claude Code 原理的书
人工智能·ai编程·claude
墨_浅-3 小时前
20260805金融科技动向:《知识产权保护和运用“十五五”规划》金融机遇
人工智能·科技·金融